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);
}
}