自定义listview holder 和adapter

来源:互联网 发布:淘宝网信用卡网银支付 编辑:程序博客网 时间:2024/06/05 05:23

之前好好看了看recyclerview的holder和adapter(api中自己就有,但是listview是没有的),觉得这种写法非常好,所以也希望listview能以这种形式来实现。直接上代码。

listviewHolder:

public abstract class myAdapter<Holder extends myHolder> extends BaseAdapter {    public abstract int onItemCount();    public abstract void onBindItem(Holder holder, int position);    public abstract Holder onCreatItem(ViewGroup parent);    @Override    public int getCount() {        return onItemCount();    }    @Override    public Object getItem(int position) {        return null;    }    @Override    public long getItemId(int position) {        return 0;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        Holder holder = null;        if (convertView==null){            holder=onCreatItem(parent);        }else {            holder= (Holder) Holder.getHolder(convertView);        }        onBindItem(holder,position);        return holder.getConvertView();    }}


listviewAdapter:

public abstract class myHolder {    private View convertView;    public myHolder(View view){        this.convertView=view;        this.convertView.setTag(R.id.listview_holder_tag_key,this);    }    public View getConvertView() {        return convertView;    }    public static myHolder getHolder(View view){        return (myHolder) view.getTag(R.id.listview_holder_tag_key);    }}

自定义的recyclerviewAdapter:

public abstract class BaseRecyclerAdapter<T> extends DefaultAdapter<T> {    protected Context mContext;    protected final int mItemLayoutId;    public BaseRecyclerAdapter(Context context, int itemLayoutId) {        mContext = context;        mItemLayoutId = itemLayoutId;        mDatas = new ArrayList<>();    }    public BaseRecyclerAdapter(Context context, int itemLayoutId, ArrayList<PlayItem> datas) {        mContext = context;        mItemLayoutId = itemLayoutId;        mDatas = (ArrayList<T>) datas;    }    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        BaseRecyclerHolder holder = new BaseRecyclerHolder(LayoutInflater.from                (mContext).                inflate(mItemLayoutId, parent, false));        setListener(parent, holder, viewType);        return holder;    }    @Override    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {        BaseRecyclerHolder baseHolder = (BaseRecyclerHolder) holder;        convert(baseHolder, (T) mDatas.get(position), position);    }    /**     * @param holder   自定义的ViewHolder对象,可以getView获取控件     * @param item     对应的数据     * @param position     */    public abstract void convert(BaseRecyclerHolder holder, T item, int position);    @Override    public int getItemCount() {        return isEmpty() ? 0 : mDatas.size();    }    protected boolean isEnabled(int viewType) {        return true;    }    public void setClickListener(BaseRecyclerHolder holder, int id, View.OnClickListener            onClickListener) {        holder.getView(id).setOnClickListener(onClickListener);    }    protected void setListener(final ViewGroup parent, final BaseRecyclerHolder viewHolder, int            viewType) {        if (!isEnabled(viewType)) return;        viewHolder.getConvertView().setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (mOnItemClickListener != null) {                    //这个方法是获取在holder里面真正的位置,而不是对应list的位置                    int position = viewHolder.getAdapterPosition()-1;                    T t = mDatas.get(position);                    mOnItemClickListener.onClick(v, viewHolder, t, position);                }            }        });        viewHolder.getConvertView().setOnLongClickListener(new View.OnLongClickListener() {            @Override            public boolean onLongClick(View v) {                if (mOnLongItemClickListener != null) {                    int position = viewHolder.getAdapterPosition();                    return mOnLongItemClickListener.onItemLongClick(v, viewHolder, mDatas.get                            (position), position);                }                return false;            }        });    }}

自定义recyclerviewholder:

public class BaseRecyclerHolder extends RecyclerView.ViewHolder {    private SparseArray<View> mViews;    private View mConvertView;    Context mContext;    public BaseRecyclerHolder(View itemView) {        this(itemView,itemView.getContext());    }    public BaseRecyclerHolder(View itemView,Context context) {        super(itemView);        mContext=context;        mConvertView = itemView;        mViews = new SparseArray<>();        mConvertView.setTag(this);    }    public static BaseRecyclerHolder createViewHolder(View itemView) {       return createViewHolder(itemView.getContext(),itemView);    }    public static BaseRecyclerHolder createViewHolder(Context context,View itemView) {        BaseRecyclerHolder holder = new BaseRecyclerHolder(itemView,context);        return holder;    }    public static BaseRecyclerHolder createViewHolder(Context context,ViewGroup parent, int layoutId) {        View itemView = LayoutInflater.from(context).inflate(layoutId, parent,                false);        return createViewHolder(context,itemView);    }    /**     * 通过viewId获取控件     */    public <T extends View> T getView(int viewId) {        View view = mViews.get(viewId);        if (view == null) {            view = mConvertView.findViewById(viewId);            mViews.put(viewId, view);        }        return (T) view;    }    public View getConvertView() {        return mConvertView;    }    /**     * 设置TextView的值     */    public BaseRecyclerHolder setText(int viewId, String text) {        TextView tv = getView(viewId);        tv.setText(text);        return this;    }    public BaseRecyclerHolder setImageResource(int viewId, int resId) {        ImageView view = getView(viewId);        view.setImageResource(resId);        return this;    }    public BaseRecyclerHolder setImageBitmap(int viewId, Bitmap bitmap) {        ImageView view = getView(viewId);        view.setImageBitmap(bitmap);        return this;    }    public BaseRecyclerHolder setImageDrawable(int viewId, Drawable drawable) {        ImageView view = getView(viewId);        view.setImageDrawable(drawable);        return this;    }    public BaseRecyclerHolder setBackgroundColor(int viewId, int color) {        View view = getView(viewId);        view.setBackgroundColor(color);        return this;    }    public BaseRecyclerHolder setBackgroundRes(int viewId, int backgroundRes) {        View view = getView(viewId);        view.setBackgroundResource(backgroundRes);        return this;    }    public BaseRecyclerHolder setTextColor(int viewId, int textColor) {        TextView view = getView(viewId);        view.setTextColor(textColor);        return this;    }    @SuppressLint("NewApi")    public BaseRecyclerHolder setAlpha(int viewId, float value) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {            getView(viewId).setAlpha(value);        } else {            // Pre-honeycomb hack to set Alpha value            AlphaAnimation alpha = new AlphaAnimation(value, value);            alpha.setDuration(0);            alpha.setFillAfter(true);            getView(viewId).startAnimation(alpha);        }        return this;    }    public BaseRecyclerHolder setVisible(int viewId, boolean visible) {        View view = getView(viewId);        view.setVisibility(visible ? View.VISIBLE : View.GONE);        return this;    }    public BaseRecyclerHolder linkify(int viewId) {        TextView view = getView(viewId);        Linkify.addLinks(view, Linkify.ALL);        return this;    }    public BaseRecyclerHolder setTypeface(Typeface typeface, int... viewIds) {        for (int viewId : viewIds) {            TextView view = getView(viewId);            view.setTypeface(typeface);            view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);        }        return this;    }    public BaseRecyclerHolder setProgress(int viewId, int progress) {        ProgressBar view = getView(viewId);        view.setProgress(progress);        return this;    }    public BaseRecyclerHolder setProgress(int viewId, int progress, int max) {        ProgressBar view = getView(viewId);        view.setMax(max);        view.setProgress(progress);        return this;    }    public BaseRecyclerHolder setMax(int viewId, int max) {        ProgressBar view = getView(viewId);        view.setMax(max);        return this;    }    public BaseRecyclerHolder setTag(int viewId, Object tag) {        View view = getView(viewId);        view.setTag(tag);        return this;    }    public BaseRecyclerHolder setTag(int viewId, int key, Object tag) {        View view = getView(viewId);        view.setTag(key, tag);        return this;    }    public BaseRecyclerHolder setChecked(int viewId, boolean checked) {        Checkable view = getView(viewId);        view.setChecked(checked);        return this;    }    /**     * 关于事件的     */    public BaseRecyclerHolder setOnClickListener(int viewId, View.OnClickListener listener) {        View view = getView(viewId);        view.setOnClickListener(listener);        return this;    }    public BaseRecyclerHolder setOnTouchListener(int viewId, View.OnTouchListener listener) {        View view = getView(viewId);        view.setOnTouchListener(listener);        return this;    }    public BaseRecyclerHolder setOnLongClickListener(int viewId, View.OnLongClickListener            listener) {        View view = getView(viewId);        view.setOnLongClickListener(listener);        return this;    }}
需要用到的defautadapter:

public abstract class DefaultAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {    protected ArrayList<T> mDatas;    protected OnItemClickListener mOnItemClickListener;    protected OnLongItemClickListener mOnLongItemClickListener;    public boolean isEmpty() {        return mDatas == null || mDatas.size() == 0;    }    /**     * 设置列表中的数据     */    public void setDatas(ArrayList<T> datas) {        if (datas == null) {            return;        }        this.mDatas = datas;        notifyDataSetChanged();    }    public ArrayList<T> getDatas() {        return mDatas;    }    /**     * 将单个数据添加到列表中     */    public void addSingleDate(T t) {        if (t == null) {            return;        }        this.mDatas.add(t);        notifyItemInserted(mDatas.size() - 1);    }    public void addDates(List<T> dates, int position) {        if (dates == null || dates.size() == 0)            return;        mDatas.addAll(position, dates);        notifyItemRangeInserted(position, dates.size());    }    public void removeDatas(List<T> dates, int position) {        if (dates == null || dates.size() == 0)            return;        mDatas.removeAll(dates);        notifyItemRangeRemoved(position, dates.size());    }    public void addSingleDate(T t, int position) {        mDatas.add(position, t);        notifyItemInserted(position);        // notifyItemRangeChanged(position, mDatas.size());    }    public void removeData(int position) {        mDatas.remove(position);        notifyItemRemoved(position);        // notifyItemRangeChanged(position, mDatas.size());    }    public void removeData(T t) {        int index = mDatas.indexOf(t);        notifyItemRemoved(index);        // notifyItemRangeChanged(index, mDatas.size());    }    /**     * 将一个List添加到列表中     */    public void addDates(List<T> dates,boolean isNotify) {        if (dates == null || dates.size() == 0) {            return;        }//        int oldSize = this.mDatas.size();//        int newSize = dates.size();//        this.mDatas.addAll(dates);//        notifyItemRangeInserted(oldSize, newSize);        this.mDatas.addAll(dates);        if(true){            notifyDataSetChanged();        }    }    public void addDates(List<T> dates) {      this.addDates(dates,false);    }    public void clearDates() {        if (!isEmpty()) {            this.mDatas.clear();        }    }    public interface OnItemClickListener<T> {        void onClick(View view, RecyclerView.ViewHolder holder, T o, int position);    }    public interface OnLongItemClickListener<T> {        boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, T o, int position);    }    /**     * 设置点击事件     *     * @param onItemClickListener     */    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {        this.mOnItemClickListener = onItemClickListener;    }    /**     * 设置长按点击事件     *     * @param onLongItemClickListener     */    public void setonLongItemClickListener(OnLongItemClickListener onLongItemClickListener) {        this.mOnLongItemClickListener = onLongItemClickListener;    }}

recyclerview的点击事件,也需要自己实现以下:

public class RecyclerViewClickListener implements RecyclerView.OnItemTouchListener {    private GestureDetector mGestureDetector;    private OnItemClickListener mListener;    //内部接口,定义点击方法以及长按方法    public interface OnItemClickListener {        void onItemClick(View view, int position);        void onItemLongClick(View view, int position);    }    public RecyclerViewClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener){        mListener = listener;        mGestureDetector = new GestureDetector(context,                new GestureDetector.SimpleOnGestureListener(){ //这里选择SimpleOnGestureListener实现类,可以根据需要选择重写的方法                    //单击事件                    @Override                    public boolean onSingleTapUp(MotionEvent e) {                        View childView = recyclerView.findChildViewUnder(e.getX(),e.getY());                        if(childView != null && mListener != null){                            mListener.onItemClick(childView,recyclerView.getChildLayoutPosition(childView));                            return true;                        }                        return false;                    }                    //长按事件                    @Override                    public void onLongPress(MotionEvent e) {                        View childView = recyclerView.findChildViewUnder(e.getX(),e.getY());                        if(childView != null && mListener != null){                            mListener.onItemLongClick(childView,recyclerView.getChildLayoutPosition(childView));                        }                    }                });    }    @Override    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {        //把事件交给GestureDetector处理        if(mGestureDetector.onTouchEvent(e)){            return true;        }else            return false;    }    @Override    public void onTouchEvent(RecyclerView rv, MotionEvent e) {    }    @Override    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {    }}

其实我个人认为,关于recyclerview的写法没有特殊需求就不要封装了,直接继承Android自己的类就行,本身已经很好了:

 recyclerView.setAdapter(new RecyclerView.Adapter<myHolder>() {            @Override            public myHolder onCreateViewHolder(ViewGroup parent, int viewType) {                return new myHolder(getLayoutInflater(), parent);            }            @Override            public void onBindViewHolder(myHolder holder, int position) {                holder.setTextView("ricoh" + position);            }            @Override            public int getItemCount() {                return 4;            }        });    }    private static class myHolder extends RecyclerView.ViewHolder {        TextView textView;        public myHolder(LayoutInflater inflater, ViewGroup viewGroup) {            super(inflater.inflate(R.layout.test_layout, viewGroup,false));            textView = (TextView) itemView.findViewById(R.id.textView);        }        public void setTextView(String s) {            textView.setText(s);        }    }

原创粉丝点击