Android布局(二)------ListView

一、作用

      以列表的形式根据数据的长自适应展示具体内容。

 

二、三要素

      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

View Code
 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 }

 

MainAdapter
 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:cacheColorHint="#00000000"  或  listView.setCacheColorHint(Color.TRANSPARENT);
 
    去除选中时的黄色底色    android:listSelector="#00000000"   或  listView.setSelector(new ColorDrawable(Color.TRANSPARENT));

    去除行与行之间的黑线或自定义黑线的颜色或用自定义图片    android:divider=" #00000000 " 或  listView.setDivider(null);

    去掉滑动条   android:scrollbars="none"

    修改行高:这个没有直接的设置选项,但可通过设置最小行高来实现    android:minHeight="30dip"

    给listview添加addFootView:    View footView=getLayoutInflater().inflate(R.layout.footview, null);

                                               listview.addFooterView(footView);     listview.setAdapter(adapter);

 

 

posted @ 2013-04-15 16:41  little_star  阅读(393)  评论(0编辑  收藏  举报