第五章 使用数据适配器

Adapter 是数据源与UI组件之间的纽带

 

Adapter:四种:

      ArrayAdapter:只能显示一行文字  操作简单

      SimpleAdapter:支持自定义布局 

      SimpleCursorAdapter:处理Cursor中的数据

      BaseAdapter:支持更复杂的布局

                      需要自行提供列表布局文件,还需自行编写适配器类

     

      ArrayAdapter、SimpleAdapter、SimpleCursorAdapter都是 BaseAdapter的子类

     

      SimpleCursorAdapter不是SimpleAdapter的子类!

     

BaseAdapter      :常用于被继承

四个要实现的方法:

      public int getCount() ------返回List的条目数,一般为数据源的大小

      public Object getItem(int position) ------获取数据集中指定位置的数据项

      public  long getItemId(int position) ----获取数据集中指定位置数据项的id

      public View getView(int position, View convertView, ViewGroup parent) ----获取显示数据集中指定位置数据项的View 对象。

     

     

View对象的获取方法:View.inflate(con,R.layout.XXX,null);-----将一个布局文件渲染成一个View对象

 

convertView 缓存。当首次加载Item的时候将布局文件渲染到缓存中如果缓存文件不为空,那么通过缓存文件来获取内部组件并修改其内容。

 

焦点的问题:当ListView中有Button,Checkbox,EditText的时候,以上控件会占有焦点,导致listView的Item点击失效,

                 解决办法:在布局文件中加属性使其失去焦点。

      android:focusable="false"    //focus n. 焦点;中心;清晰;焦距

    android:focusableInTouchMode="false"

 

 

           案例代码:

                 在package com.example.administrator.baseadapterdemo.custom 中

                      创建MyAdapter extends BaseAdapter

  1 public class MyAdapter extends BaseAdapter
  2 {
  3     private Context context;//用于接收传递过来的Context对象
  4     private List list;//用于接收传递过来的数据集合
  5 
  6     public MyAdapter(Context context, List list)
  7     {
  8         this.context = context;
  9         this.list = list;
 10     }
 11 
 12     /**
 13      * 获取list(listview)的条目的数量
 14      * 固定写法
 15      *
 16      * @return
 17      */
 18     @Override
 19     public int getCount()
 20     {
 21         return list.size();
 22     }
 23 
 24     /**
 25      * 返回条目(list中存储的某一条对象数据)
 26      * 固定写法
 27      *
 28      * @param position //position n 位置
 29      * @return
 30      */
 31     @Override
 32     public Object getItem(int position)
 33     {
 34         return list.get(position);
 35     }
 36 
 37     /**
 38      * 返回条目id(list中存储的某一条对象数据在list中的位置)
 39      * 固定写法
 40      *
 41      * @param position
 42      * @return
 43      */
 44     @Override
 45     public long getItemId(int position)
 46     {
 47         return position;
 48     }
 49 
 50     /**
 51      * 自定义ViewHolder内部类 为了减少findviewbyid的次数,封装控件的引用
 52      */
 53     private class ViewHolder
 54     {
 55         private TextView tv_name, tv_age;
 56         private Button btn;
 57     }
 58 
 59     /**
 60      * 返回显示数据集中指定位置数据项的View 对象
 61      *
 62      * @param position
 63      * @param convertView //旧的View重用   convert  vt. 使转变;转换…;使…改变信仰
 64      * @param parent
 65      * @return
 66      */
 67     @Override
 68     public View getView(final int position, View convertView, ViewGroup parent)
 69     {
 70         ViewHolder viewHolder = null;//申明viewHolder对象
 71         if (convertView == null)//第一次进入 convertView复用组件为空,view无复用时
 72         {
 73             viewHolder = new ViewHolder();//创建viewHolder对象
 74             //
 75             //相当于自建组件view,填充给convertView
 76             //static View inflate(Context context, @LayoutRes int resource, ViewGroup root)
 77             //
 78             convertView = View.inflate(context, R.layout.item_baseadapter, null);//inflate vt. 使充气;使通货膨胀
 79             //给viewHolder里的组件赋值
 80             //布局文件填充给了convertView,所以在convertView里面findViewById()
 81             viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
 82             viewHolder.tv_age = (TextView) convertView.findViewById(R.id.tv_age);
 83             viewHolder.btn = (Button) convertView.findViewById(R.id.btn);
 84             viewHolder.btn.setFocusable(false);//使btn失去焦点
 85 
 86             //保存viewHolder, tag n 标签
 87             convertView.setTag(viewHolder);
 88         } else//convertView复用组件不为空, view复用时
 89         {
 90             //取出前面保存的viewHolder
 91             viewHolder = (ViewHolder) convertView.getTag();
 92         }
 93 
 94         viewHolder.btn.setOnClickListener(new View.OnClickListener()
 95         {
 96             @Override
 97             public void onClick(View v)
 98             {
 99                 TextView textView = (TextView) ((MainActivity) context).findViewById(R.id.tv);
100                 textView.setText("按钮详情: 第 " +
101                         (position + 1) + "条  " + ((Person)getItem(position)).toString());
102             }
103         });
104 
105         //获取数据集中指定位置数据项的person对象,并将值放入viewHolder对应的组件中
106         Person person = (Person) getItem(position);
107         Log.e("getView()当前条目为:", person.toString());
108         viewHolder.tv_name.setText(person.getName());
109         viewHolder.tv_age.setText(person.getAge() + "");
110 
111         return convertView;
112     }
113 }

 

 

                       

posted on 2015-12-06 18:47  starFarming  阅读(260)  评论(0编辑  收藏  举报