Adapter是连接后端数据和前端显示的桥梁,是数据和UI(View)之间的纽带。
    在常见的View(ListView,GridView)等地方都需要用到Adapter。数据、Adapter和View之间的关系如下:
    常见的适配器有以下几种:
  • BaseAdapter:是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
  • SimpleAdapter:有最好的扩充性,可以自定义出各种效果。
  • ArrayAdapter:支持泛型操作,最为简单,只能展示一行字。
  • SimpleCursorAdapter:可以适用于简单的纯文字型ListView,也可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。
    从源码上分析,其它类都是继承了BaseAdapter类,继承该类可以实现的功能最丰富,继承它需要实现以下四个方法:
  • getCount():得到数据的行数,也可以控制item的数量
  • getItem(int position):根据positon得到某一行的记录
  • getItemId(int postion):得到某一条记录的ID
  • getView(int position, View cnverView, ViewGroup parent):最重要的一个方法,重点介绍。功能是定义适配器以什么样的方式显示我们填充的数据,参数介绍如下,
    position表示将显示的是第几行,converView是从布局文件(List中item的布局)中inflate来的,parent表示此视图最终会被附加到的父级视图。经典示例如下:
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater)MyListView.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View itemView = inflater.inflate(R.layout.item, null);
                TextView title = (TextView)itemView.findViewById(R.id.itemTitle);
                title.setText(itemTitles[position]);
                return itemView;
            } else {
                TextView title = (TextView)convertView.findViewById(R.id.itemTitle);
                title.setText(itemTitles[position]);
                return convertView;
            }
        }

通过视图缓存机制优化,适配器的完整代码如下:

public class ViewHolderAdapter extends BaseAdapter {
    private List<String> mData;
    private LayoutInflater mInflater;

    public ViewHolderAdapter(Context context, List<String> data){
        this.mData=data;
        mInflater=LayoutInflater.from(context);
    }
    
    @Override
    public int getCount() {
// TODO Auto-generated method stub,控制只显示3个item
        return mData.size() > 3 : 3 : mData.size;
    }

    @Override
    public Object getItem(int position) {
// TODO Auto-generated method stub
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
// TODO Auto-generated method stub
        return position;
    }

    public final class ViewHolder{
        public ImageView img;
        public TextView title;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
        ViewHolder holder=null;
        if(convertView==null){
            holder=new ViewHolder();

            convertView=mInflater.inflate(R.layout.viewholder_item,null);//填充自定义item
            holder.img=(ImageView)convertView.findViewById(R.id.imageView);
            holder.title=(TextView)convertView.findViewById(R.id.textView);
            convertView.setTag(holder);
        }else{
//通过Tag找到缓存的布局
            holder=(ViewHolder)convertView.getTag();
        }

        holder.img.setBackgroundResource(R.drawable.one);
        holder.title.setText(mData.get(position));

        return convertView;
    }

}

最后在MainActivity中显示

public class MainActivity extends Activity {
    private List<String> mData;
    private ViewHolderAdapter adapter;
    private ListView listview;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listview=(ListView) findViewById(R.id.listview);
        mData=new ArrayList<String>();
        for(int i=0;i<120;i++){
            mData.add(""+i);
        }

        adapter=new ViewHolderAdapter(this,mData);
        listview.setAdapter(adapter);

    }
}

 

 程序猿必读

posted on 2016-11-21 11:57  龙种人  阅读(506)  评论(0编辑  收藏  举报