adapter的优化---配合上一篇viewHolder的封装

来源:互联网 发布:上海网络借贷平台备案 编辑:程序博客网 时间:2024/06/05 15:39

在上一篇viewHolder的封装中,我们对listview这种控件的使用做了viewHolder的优化。使用中我们发现还是要setAdapter使用BaseAdapter这种安卓原生的适配器,所以这次我们进一步的优化listview从封装适配器这个角度。当封装好了adapter和viewHolder再使用listview会更加的方便。

自己写一个CommonAdapter来封装adapter代码如下:

/** * @param <B> 实体类bean 绑定数据 */public abstract class CommonAdapter<B> extends BaseAdapter {    protected Context mContext;    private int mItemLayoutId;    private List<B> mDataList;//存放实体类的列表(数据存放在实体类中)    public CommonAdapter(Context mContext, int mItemLayoutId) {        this(mContext, null, mItemLayoutId);    }    public CommonAdapter(Context mContext, List<B> dataList, int itemLayoutId) {        this.mContext = mContext;        this.mDataList = dataList;        this.mItemLayoutId = itemLayoutId;    }    public void setDataList(List<B> listData) {        this.mDataList = listData;        notifyDataSetChanged();    }    public List<B> getDataList() {        return mDataList;    }    @Override    public int getCount() {        return mDataList == null ? 0 : mDataList.size();    }    @Override    public B getItem(int position) {        return mDataList.get(position);    }    @Override    public long getItemId(int position) {        return 0;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        CommonViewHolder commonViewHolder = CommonViewHolder.get(mContext, convertView, mItemLayoutId);        B itemData = getItem(position);        if (position < mDataList.size() && itemData != null) {            bindData(commonViewHolder, position, itemData);        }        return commonViewHolder.getConvertView();    }    /**     * 绑定列表项中的数据     * @param commonViewHolder     * @param position     * @param itemData     */    public abstract void bindData(CommonViewHolder commonViewHolder, int position, B itemData);}


使用方法

public class MainActivity extends AppCompatActivity {    ArrayList<HashMap<String, Object>> itemDataList = new ArrayList<HashMap<String, Object>>();//存放数据    private ListView mListView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mListView = (ListView) findViewById(R.id.listview);        MyAdapter myAdapter = new MyAdapter(MainActivity.this, R.layout.item_listview);        myAdapter.setDataList(addData());        mListView.setAdapter(myAdapter);    }    private class MyAdapter extends CommonAdapter<HashMap<String, Object>> {        public MyAdapter(Context mContext, int mItemLayoutId) {            super(mContext, mItemLayoutId);        }        @Override        public void bindData(CommonViewHolder commonViewHolder, int position, HashMap<String, Object> itemData) {            commonViewHolder.setText(R.id.tv_title,(String)   getDataList().get(position).get("itemTitle"));            commonViewHolder.setText(R.id.tv_content, (String) getDataList().get(position).get("itemData"));        }    }    /**     * 数据源     *     * @return     */    public ArrayList<HashMap<String, Object>> addData() {        ArrayList<HashMap<String, Object>> listItemData = new ArrayList<HashMap<String, Object>>();        HashMap<String, Object> hashMap;        for (int i = 0; i < 20; i++) {            hashMap = new HashMap<String, Object>();            hashMap.put("itemTitle", "第" + i + "行");            hashMap.put("itemData", "www");            listItemData.add(hashMap);        }        return listItemData;    }}


使用了commonAdapter,只需要关注列表项中数据绑定的问题。列表项中每一项应该填什么数据即可。

0 0