listview实现漂亮的自定义表格实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
竭诚为您提供优质文档/双击可除listview实现漂亮的自定义表格实例
篇一:android学习笔记二十四之listView列表视图二
android学习笔记二十四之listView列
表视图二
前面一篇我们介绍了常用的几种适配器的简单实现和listView的简单使用,这一篇中,我们介绍一下listView
的优化和一些其它的问题。
listView优化方法一
在listView中,我们最常用的就是自定义adapter,在我们自定义adapter中,需要实现两个比较重要的方法getcount()和getView(),前者是负责计算listView的
总item数,后者是生成item,有多少个item就会调用getView()方法多少次。
getView()方法每次调用的时候都会重新inflate一个View出来返回去,但是对于listView,只需要保留能够显示的最大的View的数目即可,而新的View 可以复用消失的View。
listView给我们提供了可复用的View
对象,在getView()方法里面,有一个参数View,这个就是可以复用的View对象。
当参数View为null的时候,我们需要inflate一个View,当它不为null的时候,我们可以直接将他返回。
例如:
@override
publicViewgetView(inti,Viewview,Viewgroupviewgroup) {
Viewholderviewholder;
//view为空的时候,inflate一个新的view
if(view==null){
view=layoutinflater.from(context).inflate(yout. item_base_adapter,null);viewholder=newViewholder();
_base_adapter=(textView)view.findViewb yid(_base_adapter);view.settag(viewholder);
}else{
viewholder=(Viewholder)view.gettag();
}
_base_adapter.settext(datas[i]);
//不为空,复用view
returnview;
}
listView优化方法二
上面介绍的是对View复用的优化,这样我们可以不必每一item都inflate一个新的view,可以通过复用,减小内存开销。
下面我们介绍一个每一个androidapp中都必不可少的操作,获取控件句柄,简单的说就是拿到id。
在listView中,我们inflate一个View,里面也有需要获取到组件id的,我们可以用Viewholder来实现优化:具体的思路就是,我们在Viewholder中存放我们需要的控件,在View为null的时候,需要inflate一个新的view,同时我们还new一个Viewholder类的对象,并将findviewbyid的结果赋值给Viewholder中对应的成员变量,我们可以调用View中settag()方法,将
Viewholder和View绑定起来。
当view不为null的时候,通过gettag()方法取出Viewholder对象,这样就可以获得Viewholder中的成员变量,也不再需要调用findViewbyid方法了。
例如:
@override
publicViewgetView(inti,Viewview,Viewgroupviewgroup) {
Viewholderviewholder;
if(view==null){
view=layoutinflater.from(context).inflate(yout. item_base_adapter,null);//view为空,new一个Viewholder对象
viewholder=newViewholder();
//获取到Viewholder对象中成员变量的id
_base_adapter=(textView)view.findViewb yid(_base_adapter);//调用settag方法,将Viewholder绑定到中
view.settag(viewholder);
}else{
//view不为空,调用gettag方法,取出保存的Viewholder对象
viewholder=(Viewholder)view.gettag();
}
_base_adapter.settext(datas[i]);
returnview;
}
staticclassViewholder{
textViewtv_base_adapter;
}
listView优化方法三
上面介绍了两种listView的优化方法,第二种优化效率根据google官方文档的解析,可以优化5%左右的效率。
下面介绍一下第三种优化方法。
在我们实际开发中,listView显示的数据都是在网络中加载,假如网络比较好,能一次将所有的数据加载出来,这样用户体验还好,如果网络不好,那么加载数据需要时间比较久,用户体验就不好。
另外,我们知道,虚拟机为每一个进程分配的内存是有限的,如果一下加载太多的数据就会出现内存溢出的情况。
为了解决这两个问题,我们可以用分批加载的方法,但是分批加载还是不能完全解决问题。
假如我有10万条数据需要加载,分批加载任然可能会出现oom问题,这时,我们需要将数据分页加载,先分页加载,然后在分批加载,这样用户体验会好一些。
listView出现的一些问题和解决
listView焦点问题
在一些情况中,我们需要在listView的item中添加button、edittext、checkbox等控件,这就涉及到了焦点获取的问题。
我们在listView的item中添加了button按钮,点击发现,我们不能触发onitemclick和onitemlongclick
方法,这就是listView的焦点被拦截了。
解决办法也很简单:
给拦截listView焦点的控件设置android:focusable=”false”属性或者代码调用setFocusable(false)防范即可。
还有一种方法就是在item布局的根节点设置
android:descendantFocusability=”blocksdescendants”属性,这个属性有三个可选值
beforedescendants:viewgroup会优先其子类控件而获取到焦点
afterdescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksdescendants:viewgroup会覆盖子类控件而直接获得焦点
这是listView焦点问题的解决方法。
listView数据更新问题
首先实现一个简单的listView
布局代码:
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_marginleft="10dp" android:layout_margintop="10dp"
android:orientation="horizontal">
android:id="@+id/btn_add_one" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="插入一条数据"/>
android:id="@+id/btn_add_on_position" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="在特定位置插入一条数据"/>
android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginbottom="10dp" android:layout_marginleft="10dp" android:orientation="horizontal">
android:id="@+id/btn_delete_one" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="根据对象删除"/>
android:id="@+id/btn_delete_on_position" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="根据位置删除"/>
android:id="@+id/btn_delete_all" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="删除所有数据"/>
android:id="@+id/lv_data"
android:layout_width="match_parent" android:layout_height="match_parent"/>
item布局代码:
android:layout_height="wrap_content" android:layout_margin="10dp"
android:gravity="center_vertical"
android:orientation="horizontal">
android:id="@+id/iv_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/icon"/>
android:id="@+id/tv_data_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginleft="5dp"
android:layout_toRightof="@id/iv_icon"android:text= "加载出来的数据"
android:textsize="18sp"/>
这里的item比较简单,就直接是一张图片和一个文字activity代码:
packagecom.example.listviewdemo.activity;
importandroid.os.bundle;
importandroid.support.annotation.nullable;
importandroid.support.v7.app.appcompatactivity;impo rtandroid.view.View;
importandroid.widget.button;
importandroid.widget.listView;
importcom.example.listviewdemo.mydata;
importcom.example.listviewdemo.R;
importcom.example.listviewdemo.adapter.dataadapter;
importjava.util.arraylist;
importjava.util.list;
/**
*createdbydevinon20xx/7/11.
*/
篇二:认识listview控件的四种视图
一、认识listview控件的四种视图:
1、图标视图
特点:可用鼠标操作,使用户能够拖放该对象,并重新排列它们。
2、小图标视图
特点:同时能够显示更多的listitem。
与图标视图相似,可由用户重新排列对象。
3、列表视图
特点:提供排序的listitems对象视图
4、报表视图
特点:提供排序的视图,通过subitems能够显示更多的信息。
二、listview控件的基本操作:
1、添加列。
第1例:为listview控件添加三列,分别显示为“qq 号”,“呢称”和“来自何处”。
示例文件:代码:
privatesubuserForm_initialize()
listView1.columnheaders.add,,"qq号"添加qq号列
listView1.columnheaders.add,,"呢称"添加呢称列
listView1.columnheaders.add,,"来自何处"添加来自何处列
listView1.View=lvwReport设置显示方式为报表格式
endsub
代码说明:
1、在工作表中用column表示列。
而在listview控件中,用columnheaders对象来操作列,而添加新的列可以用columnheaders对象的add方法。
具体如下:
listView1.columnheaders.add序号,唯一的字符串标识,列标显示文字,列宽,列的内容对齐方式,所使用的图标序号。
如本例中:listView1.columnheaders.add,,"qq号"
2、listview控件的View属性决定着它的显示的方式,具体如下:listView1.View=lvwicon图标显示
listView1.View=lvwsmallicon小图标显示
listView1.View=lvwlist列表显点击浏览该文件
示listView1.View=lvwReport报表显示添加效果:
此主题相关图片如下:
第2例:为listview控件添加三列,分别显示为“qq 号”,“呢称”和“来自何处”。
另三列的列宽各占用listView1控件总宽度的三分之,第1列为左对齐,第2列为居中对齐,第3列为右对齐。
代码:
privatesubuserForm_initialize()添加qq号列,列宽占总宽度的三分之一,左对齐
listView1.columnheaders.add,,"qq号
",listView1.width/3,lvwcolumnleft添加呢称列,列宽占总宽度的三分之一,居中对齐
listView1.columnheaders.add,,"呢称
",listView1.width/3,lvwcolumncenter添加来自何处列,列宽占总宽度的三分之一,右对齐
listView1.columnheaders.add,,"来自何处
",listView1.width/3,lvwcolumnRight添加来自何处列listView1.View=lvwReport设置显示方式为报表格式
endsub
2、添加记录。
第3例:为listview控件添加三列,分别显示为“qq 号”,“呢称”和“来自何处”。
并且把如下图所示工作表的中记录添加到listview控件中。
效果如下图所示。