关于android中expandablelistview添加数据的办法
一。
前言
因为项目的需要,开始学习android开发,是做一个类似于谷歌自带的浏览器,当做到下载管理页面的时候,iew如何动态更新把我给难住了。
后来通过大量的上网查资料,编码实践终于找到了解决办法。
现在把方法与大家共同探讨学习。
由于本人还是小菜鸟,文中肯定会出现一些低级错误,恳请大家批评指正。
谢谢啦。
首先学习参考下谷歌浏览器下载的界面:
界面比较的简洁明,很明确是用iew外加adapter实现的,每个父项(group)展开来就是一个子项(child)列表,每个child包含一个progressbar和imageview和若干个iew。
二. iew和ExpandableListAdapter熟悉
首先来看一下iew应用的一个简单的例子,重点是ExpandableListAdapter适配器的使用。
例子1:
1. Test.java
public class TestActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//创建一个BaseExpandableListAdapter对象
ExpandableListAdapter adapter = new BaseExpandableListAdapter()
{
private String[] armTypes = new String[]
{ "第0行", "第1行", "第2行"};
private String[][] arms = new String[][]
{
{ "第0项", "第1项"},
{ "第0项", "第1项", "第2项"},
{ "第0项", "第1项" , "第2项" , "第3项"}
};
//获取指定组位置、指定子列表项处的子列表项数据
@Override
public Object getChild(int groupPosition, int childPosition)
{
return arms[groupPosition][childPosition];
}
@Override
//子项id
public long getChildId(int groupPosition, int childPosition)
{
return childPosition;
}
@Override
//该组的子项数目
public int getChildrenCount(int groupPosition)
{
return arms[groupPosition].length;
}
//返回TextView对象
private TextView getTextView()
{
//设置每个TextView外观
//因为我使用的是480*320模拟器进行编码测试,所以在其他分辨率的模拟器上运行可能group项显示出来会出
//现重叠等问题,请修改下面函数中红色字体的参数值调整即可
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, 64);
TextView textView = new TextView(TestActivity.this);
textView.setLayoutParams(lp);
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
textView.setPadding(36, 0, 0, 0);
textView.setTextSize(20);
return textView;
}
//该方法决定每个子选项的外观
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent)
{
System.out.println("第"+groupPosition+"行"+","+"第"+childPosition+"项");
TextView textView = getTextView();
textView.setText(getChild(groupPosition, childPosition).toString());
return textView;
}
//获取指定组位置处的组数据
@Override
public Object getGroup(int groupPosition)
{
return armTypes[groupPosition];
}
@Override
//获得组数目
public int getGroupCount()
{
return armTypes.length;
}
@Override
public long getGroupId(int groupPosition)
{
return groupPosition;
}
//该方法决定每个组选项的外观
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent)
{
System.out.println("第"+groupPosition+"行");
LinearLayout ll = new LinearLayout(TestActivity.this);
ll.setOrientation(0);
TextView textView = getTextView();
textView.setText(getGroup(groupPosition).toString());
ll.addView(textView);
return ll;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition)
{
return true;
}
@Override
public boolean hasStableIds()
{
return true;
}
};
ExpandableListView expandListView = (ExpandableListView)
findViewById(R.id.list);
//设置adapter
expandListView.setAdapter(adapter);
}
}
2.Main.xml
代码运行之后是这个效果,废话我就不多说了。
大致原理就是为了每个iew配置了一个adapter适配器,规定了数据显示的格式内容。
而我们是通过重写ExpandableListadapter的一些方法达到我们的目的的。
函数很多,不一一说,不过有几个比较重要的函数如下:
public Object getGroup(int groupPosition)
//获得父项数据
public Object getChild(int groupPosition, int childPosition):
//获得子项数据
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent)
//获得父项的view
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent)
//获得子项的view
这些函数都是在iew显示时候适配器自动调用执行的。
在这里我发现了一些的问题。
在进行一些计算时候,有写数据被重复计算了或而且显示数据被覆盖,找其原因就是,就是每个函数被调用的次数不止一次。
。
为了弄清楚真相,我分别在getGroupView(),getChildView()这两个关键函数里写了几个控制台输出信息,方便我们观察其函数的调用关系和顺序。
当程序运行第一次显示时候,如图2,观察结果如下:
getGroupView()函数被总共调用了6次,在绘制每一行都被调用了2次,而且是安顺序的,与此同时,子项的构造函数getChildView()却没有被调用。
可能大家都有疑问了,稍安勿躁,我们再进行下一步操作,展开第0行,如图3,这是控制台输出如下:
很明显,这次每个父项都被绘制了两次,子项也是,而且都是按顺序的,绘制完第0行,第0项,第1项。
。
。
。
绘完重头开始一遍。
不信我们可以多试几次,是类似的情况,同一项都被绘制了两次。
由上我们可以总结出这样一个规律,当显示这样一个特殊的iew时候,只要你进行一次界面的操作,展开或者关闭一个项,函数都要进行重绘,重新绘制显示出来的行和项,就像显示器的刷新一样。
而且这样的操作要进行重复的2次。
为什么是2次呢。
。
我也百思不得其解,上网查了许多资料都没有说明,最后在逛外国一论坛贴子时,看到一个老外给出了这样解答。
。
翻译过来大概是这样的,android并不保证每次的数据刷新成功,所以它就多刷了几次保证数据能够正常显示出来,正确与否有待考证,勉强算个理由吧。
。
所以,大家注意了,以后就不要在adapter重载的函数里特别是getchildview()和getgroupview(),放一些异步的数据计算等相关操作,因为这些数据可能就会被系统第二次调用函数所覆盖掉。
。
。
。
三。
iew动态刷新显示数据
1.Handler机制
Android不允许Activity新启动的线程访问该Activity里的UI组件,这就出现了新线程无法改变UI界面的属性,但是我们要让新启动的线程周期性的改变界面组件的属性,就需要通过一些特殊的方法。
android有几种方法可以实现,分别是AsyncTask,Handler等几种方式。
其他几种方式不熟悉,这里我用的是Handler机制。
Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据。
Handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程)。
这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传递Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。
Handler中分发消息的一些方法,具体请看api和源码:
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
2. notifyDataSetChanged()
iew在你不做任何界面操作时是不会自动调用函数刷新数据的。
而有时候我们需要android界面自动更新某些界面元素,这就需要用到notifyDataSetChanged()。
而notifyDataSetChanged()方法就是通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容的。
ExpandableListView的长按事件怎么实现
某个类(假如为A)实现OnItemLongClickListener接口,然后在onItemLongClick方法里面写长按的逻辑。
class A implement OnItemLongClickListener{onItemLongClick(){你长按的逻辑}}然后ExpandableListView.setOnItemLongClickListener(new A());以上只是举例,真正如何设计结合你代码。
fragment中怎么实现expandablelistview
将在手机调试的工程退出,再点击进去的时候列表的信息又全部正常显示出来了。
曾经想过去人为地去控制Activity的生命周期,以达到想要的效果,不过感觉不是常规做法没去用。
最后在fragment里用getActivity().recreate();页面闪一下,数据就弄出来了。
原来其实很简单,Activity重新启动,所有的数据重新加载,新添加的数据当然会显示到ExpandableListView里面
wordpress高级跨屏企业主题,通用响应式跨平台站点开发,自适应PC端+各移动端屏幕设备,高级可视化自定义设置模块+高效的企业站搜索优化。wordpress绿色企业自适应主题采用标准的HTML5+CSS3语言开发,兼容当下的各种主流浏览器: IE 6+(以及类似360、遨游等基于IE内核的)、Firefox、Google Chrome、Safari、Opera等;同时支持移动终端的常用浏览器应...
百纵科技怎么样?百纵科技国人商家,ISP ICP 电信增值许可证的正规公司,近期上线美国C3机房洛杉矶独立服务器,大带宽/高配置多ip站群服务器。百纵科技拥有专业技术售后团队,机器支持自动化,自助安装系统 重启,开机交付时间 30分钟内交付!美国洛杉矶高防服务器配置特点: 硬件配置高 线路稳定 洛杉矶C3机房等级T4 平价销售,支持免费测试,美国独服适合做站,满意付款。点击进入:百纵科技官方网站地...
beervm是一家国人商家,主要提供国内KVM VPS,有河南移动、广州移动等。现在预售湖南长沙联通vds,性价比高。湖南长沙vps(长沙vds),1GB内存/7GB SSD空间/10TB流量/1Gbps端口/独立IP/KVM,350元/月,有需要的可以关注一下。Beervm长沙联通vps套餐:长沙联通1G青春版(预售)长沙联通3G标准版(预售)长沙联通3G(预售)vCPU:1vCPU:2vCPU...
expandablelistview为你推荐
sql四舍五入SQL中如何以0.5为单位进行四舍五入计算机房360电脑上的杀毒软件被360覆盖了,怎么找回?建行手机网站建设手机银行首次怎样登录视频托管我想做一些游戏教学视频,放到网上收费该可以吗?excel大写金额EXCEL如何显示出汉字大写金额renderpartialreact里面使隐藏的组件显示出来是addclass还是renderpps官网pps官方下载,pps播放器下载shoujiao手机电池突然充不上电,是怎么回事?该怎么办?databasenamefoxpro中的的命令格式云输入法如何使用QQ云输入法?
花生壳动态域名 新秒杀 新世界电讯 云主机51web tightvnc 台湾谷歌网址 湖南服务器托管 metalink 中国电信宽带测速器 空间租赁 独享主机 工信部网站备案查询 万网主机 万网注册 卡巴斯基试用版下载 北京主机托管 七十九刀 phpinfo winds 建站技术 更多