对BaseAdapter和ViewHolder的封装

来源:互联网 发布:龙蛇演义 知乎 编辑:程序博客网 时间:2024/05/20 19:17

项目结构如下:


其中MyBaseAdapter和BaseHolder是2个抽象类,分别是对BaseAdapter和ViewHolder的封装.MainActivity为测试类.

1.MyBaseAdapter类

package com.example.mchenys.mybaseadapterdemo.adapter;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import com.example.mchenys.mybaseadapterdemo.holder.BaseHolder;import java.util.List;/** * 自定义BaseAdapter的基类 * Created by mChenys on 2015/11/15. */public abstract class MyBaseAdapter<T> extends BaseAdapter {    private List<T> mData;    public MyBaseAdapter(List<T> data) {        mData = data;    }    @Override    public int getCount() {        return mData == null ? 0 : mData.size();    }    @Override    public T getItem(int position) {        return mData == null ? (T) null : mData.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        BaseHolder holder;        if (null == convertView) {            holder = getBaseHolder(position);            convertView = holder.getConvertView();        } else {            holder = (BaseHolder) convertView.getTag();        }        holder.setData(getItem(position));        return convertView;    }    /**     * 由子类去实现获取BaseHolder的方法     *     * @param position     * @return BaseHolder     */    public abstract BaseHolder getBaseHolder(int position);}

2.BaseHolder类

package com.example.mchenys.mybaseadapterdemo.holder;import android.view.View;/** * 自定义BaseHolder的基类 * Created by mChenys on 2015/11/15. */public abstract class BaseHolder<T> {    private View mRootView;    private T mData;    public BaseHolder() {        //初始化item的根布局        mRootView = initItemLayout();        //绑定holder到当前根布局中        mRootView.setTag(this);    }    /**     * 获取item的根布局     *     * @return     */    public View getConvertView() {        return mRootView;    }    /**     * 设置item的数据     *     * @param t 具体的数据     */    public void setData(T t) {        mData = t;        refreshView(t);    }    /**     * 获取显示的数据     *     * @return     */    public T getmData() {        return mData;    }    /**     * 由子类去实现刷新界面数据的方法     *     * @param t 具体的数据     */    public abstract void refreshView(T t);    /**     * 由具体的子类去实现初始化listView Item的根布局     *     * @return     */    public abstract View initItemLayout();}

3.MainActivity测试类

package com.example.mchenys.mybaseadapterdemo;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.ListView;import android.widget.TextView;import com.example.mchenys.mybaseadapterdemo.adapter.MyBaseAdapter;import com.example.mchenys.mybaseadapterdemo.holder.BaseHolder;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    private List<String> mData = new ArrayList<>();    private ListView mListView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mListView = new ListView(this);        setContentView(mListView);        initData();        showListView();    }    /**     * 显示ListView     */    private void showListView() {        mListView.setAdapter(new MyBaseAdapter<String>(mData) {            @Override            public BaseHolder getBaseHolder(int position) {                return new BaseHolder<String>() {                    private TextView tvInfo;                    @Override                    public View initItemLayout() {                        View view = View.inflate(MainActivity.this, R.layout.item_list, null);                        tvInfo = (TextView) view.findViewById(R.id.id_tv_info);                        return view;                    }                    @Override                    public void refreshView(String s) {                        tvInfo.setText(s);                    }                };            }        });    }    /**     * 初始化测试数据     */    private void initData() {        for (int i = 0; i < 20; i++) {            mData.add("测试数据:" + i);        }    }}

4.item_list.xml文件

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <TextView        android:id="@+id/id_tv_info"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center"        android:padding="10dp" /></LinearLayout>

5.测试效果



0 0
原创粉丝点击