zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    耿建超英语语法---使动词
    tensorboard的安装及遇到的问题
    利用PIL实现图片的切割
    mysql explain
    laravel sql查询
    聚簇索引和非聚簇索引
    修改数据表结构导致的问题
    接口优化记录
    redis优化记录
    php 判断两个数组是否相等
  • 原文地址:https://www.cnblogs.com/wyqfighting/p/3022400.html
Copyright © 2011-2022 走看看