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

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     @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: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);

 原文地址:http://www.cnblogs.com/wyqfighting/archive/2013/04/15/3022400.html

原创粉丝点击