本文是上篇文字的继续,看本文前需要了解ViewHolder封装。
Android万能适配器(一)封装ViewHolder
封装Adapter
Adapter这里主要是做一个简单的封装继承BaseAdapter类会默认需要覆盖几个方法。比如getCount ,getItemID等。我们一般写的Adapter每次都会重复这几个方法,内容返回的也几乎一模一样,所以这里可以封装到父类里面。用泛型可以虚拟一个实体类,达到使用list效果。使用这个类时候 传人一个真实实体类就ok了。下面这个就是封装好后的Adapter源码了。一般希望名字为BaseAdapter为了区分和系统BaseAdapter的区别这里使用MyBaseAdapter。
public abstract class MyBaseAdapter<T> extends BaseAdapter { protected LayoutInflater mInflater; protected Context mContext; protected List<T> mDatas; protected final int mLayoutId; public MyBaseAdapter(Context context, List<T> mDatas, int mLayoutId) { mInflater = LayoutInflater.from(context); this.mContext = context; this.mDatas = mDatas; this.mLayoutId = mLayoutId; } @Override public int getCount() { return mDatas.size(); } @Override public Object getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // 实例化一个viewHolder ViewHolder viewHolder = ViewHolder.get(mContext, convertView, parent, mLayoutId, position); holdItem(viewHolder, mDatas.get(position)); return viewHolder.getConvertView(); } public abstract void holdItem(ViewHolder holder, T item); }
这里使用封装好的Adapter实现上篇文章只有一个TextView的列表适配器,源码如下
public class TestAdapter extends MyBaseAdapter<String>{ public TestAdapter(Context context, List<String> mDatas, int mLayoutId) { super(context, mDatas, mLayoutId); } @Override public void holdItem(ViewHolder holder, String item) { TextView view = holder.getView(R.id.text_title); <span style="white-space:pre"> </span>view.setText(item); } }现在的适配器看着非常简单,而且效率非常好。喜欢就赞一个吧
使用Adapter跟普通的是一样的。直接listview 设置就ok
private void initListView() { mListView = (ListView) findViewById(R.id.list_main); mAdapter = new TestAdapter(this, mDatas,R.layout.item_1); mListView.setAdapter(mAdapter); }有兴趣学习可以加入QQ群372647271 IsCoding工作室一起探讨
源码下载