Android布局(二)------ListView
来源:互联网 发布:js的test方法 编辑:程序博客网 时间:2024/05/07 06:31
一、作用
以列表的形式根据数据的长自适应展示具体内容。
二、三要素
1、View:用来展示列表,通常是一个xml所指定的。
2、Adapter:把不同的数据映射到view上,不同的数据对应不同的适配器,如ArrayDdapter,CursorAdapter,SimpleAdapter等,他们能将数组,指针指向的数据,Map等数据映射到View上。
通过listviiew的setadapter方法可以设置其适配器 public void setAdapter (ListAdapter adapter) setAdapter方法的参数是ListAdapter,适配器可以为以下八种类型: ArrayAdapter<T>, BaseAdapter,
CursorAdapter, SimpleAdapter, HeaderViewListAdapter, ResourceCursorAdapter, SimpleCursorAdapter, WrapperListAdapter 。
ArrayAdapter最为简单,只能展示一行字。
SimpleAdapter有最好的扩充性,可以自定义出各种效果。
SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方便的把数据库的内容以类表的形式展示出来。
以上三种适配器都继承自BaseAdapter,继承BaseAdapter之后,需要重写以下四个方法:getCount,getItem,getItemId,getView。
3、数据:具体的将被映射的数据和资源,如字符串,图片,基本组件等,通过适配器显示到ListView上。所有的数据和资源要显示到ListView上都通过适配器来完成。
三、原理
ListView绘制的过程: 首先,系统在绘制ListView之前,将会先调用getCount方法来获取Item的个数。之后每绘制一个 Item就会调用一次getView方法,在此方法内就可以引用事先定义好的xml来确定显示的
效果并返回一个View对象作为一个Item显示出来。也正是在这个过程中完成了适配器的主要转换功能,把数据和资源以开发者想要的效果显示出来。也正是getView的重复调用,使得ListView的使用更 为简单和灵
活。这两个方法是自定ListView显示效果中最为重要的,同时只要重写好了就两个方法,ListView就能完全按开发者的要求显示。而 getItem和getItemId方法将会在调用ListView的响应方法的时候被调用到。所以要
保证ListView的各个方法有效的话,这两个方 法也得重写。比如:没有完成getItemId方法的功能实现的话,当调用ListView的getItemIdAtPosition方法时将会得不到想 要的结果,因为该方法就是调用了对应的适配
器的getItemId方法。
四、示例用法
显示如下效果:
xml:main.xml, mainitem.xml
java: MainActivity.java, MainAdapter.java
1、main.xml 中是ListView的定义,mainitem.xml 中是ListView中每一项的具体实现:logo、name、arrow
1 public class SuperMEyeActivity extends Activity { 2 private MainAdapter mAdpt; 3 @Override 4 public void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.main); 7 8 mAdpt = new MainAdapter(this); 9 ListView lv = (ListView)findViewById(R.id.listView1);10 lv.setAdapter(mAdpt);11 }12 }
1 public class MainAdapter extends BaseAdapter{ 2 private Context mCtx; 3 private List<MListItem> mlists; 4 public MainAdapter(Context mCtx){ 5 super(); 6 mlists = new ArrayList<MListItem>(); 7 mlists.add(new MListItem(R.drawable.video, "视频播放")); 8 mlists.add(new MListItem(R.drawable.device, "设备列表")); 9 mlists.add(new MListItem(R.drawable.config, "本地配置"));10 mlists.add(new MListItem(R.drawable.ref, "关于")); 11 this.mCtx = mCtx;12 }13 @Override14 public int getCount() { 15 return mlists.size();16 }17 18 @Override19 public Object getItem(int position) {20 return mlists.get(position);21 }22 23 @Override24 public long getItemId(int position) {25 return position;26 }27 28 public class ViewHolder {29 ImageView logo; 30 TextView name;31 ImageView arrow;32 }33 @Override34 //用来获得指定位置要显示的View35 public View getView(int position, View convertView, ViewGroup parent) {36 ViewHolder vh;37 if(convertView==null){38 LayoutInflater inflater = (LayoutInflater)mCtx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 39 convertView = inflater.inflate(R.layout.mainitem, null);40 vh = new ViewHolder(); 41 vh.logo = (ImageView)convertView.findViewById(R.id.logo);42 vh.name = (TextView) convertView.findViewById(R.id.name); 43 vh.arrow = (ImageView)convertView.findViewById(R.id.arrow);44 convertView.setTag(vh);45 }else46 vh = (ViewHolder) convertView.getTag();47 vh.logo.setBackgroundResource(mlists.get(position).iconid); 48 vh.name.setText(mlists.get(position).name); 49 vh.arrow.setBackgroundResource(R.drawable.arrow);50 return convertView;51 }52 53 }
即一个Adapter对应一个实际的list数组和listView显示。
ps:convertView.setTag(vh);是为了提高效率,如果已经画过这个View,就没有必要再重画了,只需要记住已画的View的标记即可。
vh = (ViewHolder) convertView.getTag();下次根据这个tag直接找到这个View。
在我们举的例子中,其实并没有必要用convertView.setTag(vh);因为我们只有四项,一页就显示完了,不存在滑动显示的问题,所有的view都必须一次画好显示。
五、常用属性
去除ListView滑到顶部和底部时边缘的黑色阴影 android:fadingEdge="none"
去除行与行之间的黑线或自定义黑线的颜色或用自定义图片 android:divider=" #00000000 " 或 listView.setDivider(null);
去掉滑动条 android:scrollbars="none"
修改行高:这个没有直接的设置选项,但可通过设置最小行高来实现 android:minHeight="30dip"
给listview添加addFootView: View footView=getLayoutInflater().inflate(R.layout.footview, null);
原文地址:http://www.cnblogs.com/wyqfighting/archive/2013/04/15/3022400.html
- Android布局(二)------ListView
- Android ListView 分类显示(二)多布局显示
- Android学习笔记二十五之ListView多布局实现
- Android——ListView多布局+适配器(二)
- Android学习笔记二十五之ListView多布局实现
- Android ListView分组布局
- android之ListView布局
- Android ListView自定义布局
- android之ListView布局
- android布局之listview
- Android 布局 listview
- android之ListView布局
- android之ListView布局
- Android布局之ListView
- Android listview多布局
- android listview多布局
- Android ListView分组布局改进
- Android ListView分组布局改进
- 『perl』学习
- UIResponder类
- 浅谈linux的死锁检测
- Mac与Window之间的共享文件
- Linux内存管理之mmap详解
- Android布局(二)------ListView
- effective java 创建和销毁对象
- softlock机制
- android 删除并新建相同的向导
- Android应用之间的数据共享
- active 控件安全初始化
- 音视频的服务性能
- 实用数据结构总结之二叉树遍历
- 关于ROWNUM的使用(一)