Android 代码

2017-05-17  本文已影响16人  Cloverss

1.RecycleView的BaseAdapter 和 ViewHolder
2.Handler的正确写法

1.BaseAdp

public abstract class BaseAdp<T> extends RecyclerView.Adapter<BaseHolder> {

    private Context context;
    private List<T> data;
    private int layoutId;

    public BaseAdp(Context context, List<T> data, int layoutId) {
        this.context = context;
        this.data = data;
        this.layoutId = layoutId;
    }

    public List<T> getData() {
        return data;
    }

    public void setData(List<T> data) {
        this.data = data;
    }

    @Override
    public BaseHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return BaseHolder.getHolder(context, parent, layoutId);
    }

    @Override
    public void onBindViewHolder(BaseHolder holder, int position) {
        this.onBind(holder, data.get(position), position);
    }

    @Override
    public int getItemCount() {
        return data == null ? 0 : data.size();
    }

    public abstract void onBind(BaseHolder baseHolder, T t, int position);

}

BaseHolder

public class BaseHolder extends RecyclerView.ViewHolder {

    private View itemView;
    private SparseArray<View> views;

    public BaseHolder(View itemView) {
        super(itemView);
        this.itemView = itemView;
        views = new SparseArray<>();
    }

    public static <T extends BaseHolder> T getHolder(Context context, ViewGroup parent, int layouId) {
        return (T) new BaseHolder(LayoutInflater.from(context).inflate(layouId, parent, false));
    }

    public <T extends View> T getView(int viewId) {
        View childView = views.get(viewId);
        if (null == childView) {
            childView = itemView.findViewById(viewId);
            views.put(viewId, childView);
        }
        return (T) childView;
    }

    public BaseHolder setOnClickListener(int viewId, View.OnClickListener listener) {
        View view = getView(viewId);
        view.setOnClickListener(listener);
        return this;
    }

}

使用范例

public class ScanHdAdp extends BaseAdp<FormConfig> implements View.OnClickListener {

    private Constant.OnRvClickListener mOnRvClickListener = null;

    public void setOnItemClickListener(Constant.OnRvClickListener listener) {
        this.mOnRvClickListener = listener;
    }

    public ScanHdAdp(Context context, List<FormConfig> data, int layoutId) {
        super(context, data, layoutId);
    }

    @Override
    public void onBind(BaseHolder baseHolder, FormConfig formConfig, int position) {
        TextView lbName = baseHolder.getView(R.id.item_other_tv);
        EditText lbEd = baseHolder.getView(R.id.item_other_ed);
        Button lbBtn = baseHolder.getView(R.id.item_other_btn);

        lbName.setText(formConfig.getLbName());
        if (!formConfig.getCanModify()) {
            lbEd.setEnabled(false);
        }
        if (formConfig.getReferType() == 0) {
            lbBtn.setVisibility(View.INVISIBLE);
        }
        lbBtn.setOnClickListener(this);
        lbBtn.setTag(position);

    }

    @Override
    public void onClick(View v) {
        if (mOnRvClickListener != null) {
            mOnRvClickListener.OnItemClick(v, (Integer) v.getTag());
        }
    }
}

2.Handler 的正确写法 (静态内部类+弱引用)

    private static class MyHandler extends Handler {
        WeakReference<MainActivity> weakReference = null;

        public MyHandler(MainActivity activity) {
            this.weakReference = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            MainActivity mainActivity = weakReference.get();
            if (null != mainActivity){
                // to do something
            }
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读