本人最近接手一个项目,兴致勃勃的看了源码,一脸懵逼,这里就不吐槽了。列表是用的listview(没有用recyclerView),代码里面的适配器写法没有封装,很多重复的代码,看到头大,自己也懒得写。所以动手封装了一下,虽然这个功能的封装很常见了,以前也做过同样的事,但是没有记录,所以这次想着记下来。
adapter写法:
/**
* 万能通适配器---ListView,GridView
*/
public abstract class CommonAdapter<D> extends BaseAdapter {
protected Context mContext;
protected int mLayoutId;
protected List<D> data;
public CommonAdapter(Context mContext, int mLayoutId, List<D> data) {
this.mContext = mContext;
this.mLayoutId = mLayoutId;
this.data = data;
}
@Override
public int getCount() {
if (data != null) {
return data.size();
}
return 0;
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
BaseViewHolder viewHolder = BaseViewHolder.getViewHolder(mContext, convertView, parent, mLayoutId, position);
convertView(viewHolder, (D) getItem(position));
return viewHolder.getConvertView();
}
public abstract void convertView(BaseViewHolder holder, D item);
}
viewHolder写法:
public class BaseViewHolder {
private View mConvertView;
private int mPosition;
private SparseArray<View> mSparseArray;
public BaseViewHolder(Context context, ViewGroup parent, int layoutId, int position) {
this.mPosition = position;
this.mSparseArray = new SparseArray<>();
this.mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
mConvertView.setTag(this);
}
public static BaseViewHolder getViewHolder(Context context, View convertView, ViewGroup parent, int layoutId, int position) {
if (convertView == null) {
return new BaseViewHolder(context, parent, layoutId, position);
}
return (BaseViewHolder) convertView.getTag();
}
public View getConvertView() {
return mConvertView;
}
public <T extends View> T getView(int viewId) {
View view = mSparseArray.get(viewId);
if (view == null) {
view = mConvertView.findViewById(viewId);
mSparseArray.put(viewId, view);
}
return (T) view;
}
/**
* TextView文本
*
* @param viewId
* @param text
* @return
*/
public BaseViewHolder setText(int viewId, String text) {
TextView view = getView(viewId);
view.setText(text);
return this;
}
/**
* ImageView 设置资源
*
* @param imageViewId
* @param drawable
* @return
*/
public BaseViewHolder setImageResourse(int imageViewId, int drawable) {
ImageView imageView = getView(imageViewId);
imageView.setImageResource(drawable);
return this;
}
public int getItemPosition() {
return mPosition;
}
}
可以在ViewHoler里封装其他属性设置,比如:字体颜色,背景等。