本人最近接手一個項目,興緻勃勃的看了源碼,一臉懵逼,這裡就不吐槽了。清單是用的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裡封裝其他屬性設定,比如:字型顔色,背景等。