BaseAdapter的封装

来源:互联网 发布:淘宝卖家仓库在哪里 编辑:程序博客网 时间:2024/06/10 10:22

ListView的使用,必须有一个装配数据的适配器。所以BaseAdapter的封装就显得尤为重要。
适配器的作用:将具体的集合数据装配到具体的一个item layout中
问题一:数据类型是不确定的。
问题二:item layout的布局是不确定的
问题三:将集合中指定位置的数据装配到item,是不确定的。
因为数据类型不确定,所以我们把封装类写为泛型类。
基于数据装配的优化,我们把ViewHolder封装了一个基类。

import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import java.util.List;/** * 作者: willkong on 2017/11/14. * 作用:BaseAdapter的抽取 */public abstract class MyBaseAdapter3<T> extends BaseAdapter{    public List<T> list;    public MyBaseAdapter3(Context context,List<T>list){        this.list = list;    }    @Override    public int getCount() {        return list==null?0:list.size();    }    @Override    public Object getItem(int position) {        return list.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    //将具体的集合数据装配到具体的一个item layout中    //问题一:item layout的布局是不确定的    //问题二:将集合中指定位置的数据装配到item,是不确定的。    @Override    public View getView(int position, View convertView, ViewGroup parent) {        BaseHolder<T> holder;        if (convertView==null){            holder = getHolder();        }else {            holder = (BaseHolder<T>) convertView.getTag();        }        //装配数据        T t = list.get(position);        holder.setData(t);        return holder.getRootView();    }    protected abstract BaseHolder<T> getHolder();}
import android.content.Context;import android.view.View;import butterknife.ButterKnife;/** * 作者: willkong on 2017/11/14. * 作用:缓存器 */public abstract class BaseHolder<T> {    private View rootView;    private T data;    public BaseHolder(Context context){        rootView = initView(context);        rootView.setTag(this);        ButterKnife.bind(this,rootView);    }    //提供item的布局    protected abstract View initView(Context context);    public T getData() {        return data;    }    public void setData(T data) {        this.data = data;        refreshData();    }    //装配过程    protected abstract void refreshData();    public View getRootView() {        return rootView;    }}

使用示例:

      //方式四:            ProductAdapter3 productAdapter3 = new ProductAdapter3(getActivity(),productList);            lvProductList.setAdapter(productAdapter3);//显示列表
import android.content.Context;import android.view.View;import android.widget.TextView;import com.willkong.p2pclient.R;import com.willkong.p2pclient.bean.Product;import com.willkong.p2pclient.ui.RoundProgress;import butterknife.Bind;/** * 作者: willkong on 2017/11/14. * 作用:xxx */public class MyHolder extends BaseHolder<Product> {    @Bind(R.id.p_name)    TextView pName;    @Bind(R.id.p_money)    TextView pMoney;    @Bind(R.id.p_yearlv)    TextView pYearlv;    @Bind(R.id.p_suodingdays)    TextView pSuodingdays;    @Bind(R.id.p_minzouzi)    TextView pMinzouzi;    @Bind(R.id.p_minnum)    TextView pMinnum;    @Bind(R.id.p_progresss)    RoundProgress pProgresss;    public MyHolder(Context context) {        super(context);    }    @Override    protected View initView(Context context) {//        return View.inflate(UIUtils.getContext(), R.layout.item_product_list, null);        return View.inflate(context, R.layout.item_product_list, null);    }    @Override    protected void refreshData() {        Product product = (Product) this.getData();        pMinnum.setText(product.memberNum);        pMinzouzi.setText(product.minTouMoney);        pMoney.setText(product.money);        pName.setText(product.name);        pProgresss.setProgress(Integer.parseInt(product.progress));        pSuodingdays.setText(product.suodingDays);        pYearlv.setText(product.yearRate);    }}