1,创建一个点击事件的接口
public interface OnItemClickListener { void onItemClick(int position); }
2,创建一个长按事件的接口:
public interface OnItemLongClickListener { boolean onItemLongClick(int position); }
3,创建一个共通的ViewHolder:
public class ComViewHolder extends RecyclerView.ViewHolder { //用来存放itemview中的子view,减少findById次数 private SparseArray<View> mViews; public ComViewHolder(View itemView) { super(itemView); mViews = new SparseArray<>(); } // 通过viewId获取view public <T extends View> T getView(int viewId) { // 先从缓存中找 View view = mViews.get(viewId); if (view == null) { view = itemView.findViewById(viewId); mViews.put(viewId, view); } return (T) view; } // 设置TextView文本 public ComViewHolder setText(int viewId, CharSequence text) { TextView tv = getView(viewId); tv.setText(text); return this; } // 设置ImageView的资源 public ComViewHolder setImageResource(int viewId, int res) { ImageView iv = getView(viewId); iv.setImageResource(res); return this; } // 设置view的Visibility public ComViewHolder setViewVisibility(int viewId, int visibility) { getView(viewId).setVisibility(visibility); return this; } // item点击事件 public void setOnItemClickListener(View.OnClickListener listener) { itemView.setOnClickListener(listener); } // item长按事件 public void setOnItemLongClick(View.OnLongClickListener listener) { itemView.setOnLongClickListener(listener); } // 通过路径设置显示图片 public ComViewHolder setImageByUrl(int viewId, HolderImageLoader imageLoader) { ImageView imageView = getView(viewId); if (imageView == null) { throw new NullPointerException("imageLoader is null !!"); } imageLoader.displayImage(imageView.getContext(), imageView, imageLoader.getImagePath()); return this; } /** * 图片加载 */ public static abstract class HolderImageLoader { private String mImagePath; public HolderImageLoader(String path){ mImagePath = path; } public String getImagePath() { return mImagePath; } public abstract void displayImage(Context context, ImageView iamgeView, String imagePath); } }
4,共通的RecyclerView.Adapter:
public abstract class CommonRecyclerAdapter<T extends BaseResponseBean> extends RecyclerView.Adapter<ComViewHolder>{ private List<T> mList; public Context mContext; private LayoutInflater mInflater; private int mLayoutRes; private MultiTypeSupport mMultiTypeSupport; private OnItemClickListener mOnItemClickListener; private OnItemLongClickListener mOnItemLongClickListener; // 普通的构造 public CommonRecyclerAdapter(List<T> list, Context context, int res) { mContext = context; mList = list; mLayoutRes = res; mInflater = LayoutInflater.from(context); } // 多布局的构造 public CommonRecyclerAdapter(List<T> list, Context context, MultiTypeSupport<T> multiTypeSupport) { this(list, context, -1); this.mMultiTypeSupport = multiTypeSupport; } @Override public int getItemViewType(int position) { if (mMultiTypeSupport != null) { return mMultiTypeSupport.getResId(mList.get(position), position); } return super.getItemViewType(position); } @Override public ComViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (mMultiTypeSupport != null) { mLayoutRes = viewType; } View itemView = mInflater.inflate(mLayoutRes, parent, false); ComViewHolder viewHolder = new ComViewHolder(itemView); return viewHolder; } @Override public void onBindViewHolder(ComViewHolder holder, final int position) { if (mOnItemClickListener != null) { holder.setOnItemClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mOnItemClickListener.onItemClick(position); } }); } if (mOnItemLongClickListener != null) { holder.setOnItemLongClick(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { return mOnItemLongClickListener.onItemLongClick(position); } }); } convert(holder, mList.get(position), position); } @Override public int getItemCount() { return mList.size(); } public abstract void convert(ComViewHolder holder, T item, int position); public void setOnItemClickListener(OnItemClickListener listener) { mOnItemClickListener = listener; } public void setOnItemLongClickListener(OnItemLongClickListener listener) { mOnItemLongClickListener = listener; } }
5,实践,业务的adapter调用
public class PoiSendHisAdapter extends CommonRecyclerAdapter<PoiSendHistoryBean>{ public PoiSendHisAdapter(List<PoiSendHistoryBean> list, Context context, int res) { super(list, context, res); } public PoiSendHisAdapter(List<PoiSendHistoryBean> list, Context context, MultiTypeSupport<PoiSendHistoryBean> multiTypeSupport) { super(list, context, multiTypeSupport); } @Override public void convert(ComViewHolder holder, PoiSendHistoryBean item, int position) { if (position == 0) { holder.setText(R.id.poi_name_tx, item.getPoiName()) .setText(R.id.poi_add_tx, item.getPoiAddr()); } else { SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm"); String strTime = format.format(new Date(item.getSendTime())); holder.setText(R.id.send_history_poi_name_tx, item.getPoiName()) .setText(R.id.send_history_poi_add_tx, item.getPoiAddr()) .setText(R.id.send_history_time_tx, strTime); TextView status = ((TextView) holder.itemView.findViewById(R.id.send_history_status)); status.setTextColor(mContext.getResources().getColor(R.color.common_text_color)); String strStatus = ""; if ("1".equals(item.getSendStatus())) { strStatus = mContext.getResources().getString(R.string.send_history_ing); } else if ("2".equals(item.getSendStatus())) { strStatus = mContext.getResources().getString(R.string.send_history_success); } else { strStatus = mContext.getResources().getString(R.string.send_history_fail); status.setTextColor(mContext.getResources().getColor(R.color.red)); } status.setText(strStatus); } } }
6,activity中:
// 构造多布局的adapter
PoiSendHisAdapter adapter = new PoiSendHisAdapter(mDataList, PositionPoiSendHistoryActivity.this, new MultiTypeSupport<PoiSendHistoryBean>() { @Override public int getResId(PoiSendHistoryBean item, int poisition) { if (poisition == 0) { return R.layout.item_poi_result; } else { return R.layout.item_poi_send_history; } } }); LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(OrientationHelper.VERTICAL); // 设置显示分割 ListView样式 mListView.setLayoutManager(new LinearLayoutManager(this)); mListView.setAdapter(adapter); adapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(int position) { TopToast.show(this, "item点击事件响应位置:"+position); } }); adapter.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(int position) { TopToast.show(this, "item长按点击事件响应位置:"+position); return true; } }); }