expandablelistviewfragment中怎么实现expandablelistview

expandablelistview  时间:2021-06-16  阅读:()

关于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里面

哪里购买香港云服务器便宜?易探云2核2G低至18元/月起;BGP线路年付低至6.8折

哪里购买香港云服务器便宜?众所周知,国内购买云服务器大多数用户会选择阿里云或腾讯云,但是阿里云香港云服务器不仅平时没有优惠,就连双十一、618、开年采购节这些活动也很少给出优惠。那么,腾讯云虽然海外云有优惠活动,但仅限新用户,购买过腾讯云服务器的用户就不会有优惠了。那么,我们如果想买香港云服务器,怎么样购买香港云服务器便宜和优惠呢?下面,云服务器网(yuntue.com)小编就介绍一下!我们都知道...

ProfitServer折优惠西班牙vps,荷兰vps,德国vps,5折优惠,不限制流量

profitserver正在对德国vps(法兰克福)、西班牙vps(马德里)、荷兰vps(杜廷赫姆)这3处数据中心内的VPS进行5折优惠促销。所有VPS基于KVM虚拟,纯SSD阵列,自带一个IPv4,不限制流量,在后台支持自定义ISO文件,方便大家折腾!此外还有以下数据中心:俄罗斯(多机房)、捷克、保加利亚、立陶宛、新加坡、美国(洛杉矶、锡考克斯、迈阿密)、瑞士、波兰、乌克兰,VPS和前面的一样性...

GreenCloudVPS$20/年多国机房可选,1核@Ryzen 3950x/1GB内存/30GB NVMe/10Gbps端口月流量2TB

GreencloudVPS此次在四个机房都上线10Gbps大带宽VPS,并且全部采用AMD处理器,其中美国芝加哥机房采用Ryzen 3950x处理器,新加坡、荷兰阿姆斯特丹、美国杰克逊维尔机房采用Ryzen 3960x处理器,全部都是RAID-1 NVMe硬盘、DDR4 2666Mhz内存,GreenCloudVPS本次促销的便宜VPS最低仅需20美元/年,支持支付宝、银联和paypal。Gree...

expandablelistview为你推荐
时间刻度机械手表的时分针时间刻度都对不准吗?离线包离线地图,离线导航包有什么区别4k超高清视频下载哪里有4K片源下载啊?补充:刚入手了一个4k电视盒,小美盒子V9,说是支持4k。正好我的电视机是4k的,想知道哪里有得下载呢?有朋友说我傻,现在基本上没有4k片源下载,而且不知道什么时候才有。等到流行的时候也许这个机器又淘汰啦!我该怎么办啊?webservice框架用JAVA作APP后端,一般用什么web service?用什么restful框架averagesPoisson-Arrivals-See-Time-Averages是什么意思netbios协议机子上启动了netbios协议,为什么还是运行不了netbios命令databasenamefoxpro中的的命令格式cursorlocation如何用ENVI把不同图像中的相同地点的某个像素点的值读出来。按时间把这个点的值连起来,。谢谢好人。医院排队系统请问医院采血排队的设备系统是独立的吗?怎么查微信注册时间怎么查看自己的微信号用了多久
虚拟主机服务商 免费域名申请 如何注销域名备案 如何注册中文域名 lnmp lamp 免费主机 谷歌香港 云图标 panel1 三拼域名 100m免费空间 秒杀预告 工信部icp备案号 工作站服务器 股票老左 服务器托管什么意思 稳定免费空间 hktv 双线机房 更多