自定义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); } }
阅读全文
0 0
- 自定义listview holder 和adapter
- Android中自定义Adapter和ListView
- ListFragment使用ListView和自定义Adapter
- Android ListView – Holder模式和getItemViewType
- listview 自定义Adapter
- listview 自定义Adapter
- 自定义Adapter与ListView
- ListView使用自定义Adapter
- ListView 自定义Adapter
- 自定义ListView的Adapter
- 自定义Adapter的ListView
- 自定义listview的adapter
- Listview的自定义Adapter
- 自定义adapter的listview
- 自定义Adapter填充listview
- 自定义ListView的Adapter
- Android入门-ListView-自定义adapter和滑动解锁
- 6.ListView的自定义adapter和监听滚动事件
- jsf
- 【Redis基础】五种数据类型
- 猴子吃桃问题-JavaScript实现
- 关于MySQL--查询今天以及昨天、上个月等等
- 判断图片是否加载完毕
- 自定义listview holder 和adapter
- 公务员面试综合分析真题解析
- 奇数判断
- Break和continue用法
- Linux设备驱动ADC部分:
- jQuery判断对象是否隐藏(display和visibility的区别)
- Sublime Text 3 在整个文件夹中查找
- 我的python学习笔记
- http-equiv