一、作用
以列表的形式根据数据的长自适应展示具体内容。
二、三要素
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 @Override 14 public int getCount() { 15 return mlists.size(); 16 } 17 18 @Override 19 public Object getItem(int position) { 20 return mlists.get(position); 21 } 22 23 @Override 24 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 @Override 34 //用来获得指定位置要显示的View 35 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 }else 46 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