天天看點

Android CommonAdapter----ListView,GridView萬能擴充卡

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