因为经常会用到RecyclerView,今天在这里总结一下实现RecyclerView点击事件的实现方法
一、通过接口回调的方式实现
1. 首先定义一个点击的接口(Recyclerview自身不带有点击事件的回调)
public interface OnRecyItemClickListener{
void onClick(View view, int position);
}
2. 在Adapter中实现点击的方法
public class ListRecycleViewAdapter extends RecyclerView.Adapter<ListRecycleViewAdapter.ListViewHolder>{
private Context mContext;
private List<String> mList;
public ListRecycleViewAdapter(Context context, List<String> list) {
mContext = context;
mList = list;
}
@Override
public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_list_recycle_view, parent, false);
ListViewHolder holder = new ListViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(final ListViewHolder holder, int position) {
holder.tv.setText(mList.get(position));
View itemView = ((RelativeLayout) holder.itemView).getChildAt(0);
if (mOnItemClickListener != null) {
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getLayoutPosition();
mOnItemClickListener.onItemClick(holder.itemView, position);
}
});
}
}
@Override
public int getItemCount() {
return mList.size();
}
private OnRecyItemClickListener mOnItemClickListener;//声明接口
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
mOnItemClickListener = onItemClickListener;
}
class ListViewHolder extends RecyclerView.ViewHolder {
TextView tv;
public ListViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.tv_list_item);
}
}
}
3. 在Activity中调用Adapter中实现的点击方法
ListRecycleViewAdapter listRecycleViewAdapter = new ListRecycleViewAdapter(SettingActivity.this, mList);
listRecycleViewAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText(this, "这是RecyclerView的点击事件", Toast.LENGTH_SHORT).show();
}
}
二、在Adapter中直接实现点击事件
public class ListRecycleViewAdapter extends RecyclerView.Adapter<ListRecycleViewAdapter.ListViewHolder>{
private Context mContext;
private List<String> mList;
public ListRecycleViewAdapter(Context context, List<String> list) {
mContext = context;
mList = list;
}
@Override
public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_list_recycle_view, parent, false);
ListViewHolder holder = new ListViewHolder(view);
//直接在这里实现点击事件
holder.tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("onCreateViewHolder", "点击了");
}
});
return holder;
}
@Override
public void onBindViewHolder(final ListViewHolder holder, int position) {
holder.tv.setText(mList.get(position));
View itemView = ((RelativeLayout) holder.itemView).getChildAt(0);
if (mOnItemClickListener != null) {
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getLayoutPosition();
mOnItemClickListener.onItemClick(holder.itemView, position);
}
});
}
}
@Override
public int getItemCount() {
return mList.size();
}
class ListViewHolder extends RecyclerView.ViewHolder {
TextView tv;
public ListViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.tv_list_item);
}
}
}
三、通过RecyclerView的addOnItemTouchListener实现点击事件
1. 首先定义类RecyclerItemClickListener实现 RecyclerView.OnItemTouchListener接口,并在内部定义一个点击监听的接口
public static class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
GestureDetector mGestureDetector;
private View childView;
private RecyclerView touchView;
public RecyclerItemClickListener(Context context, final HomePageFragment.RecyclerItemClickListener.OnItemClickListener mListener) {
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent ev) {
if (childView != null && mListener != null) {
mListener.onItemClick(childView, touchView.getChildPosition(childView));
}
return true;
}
@Override
public void onLongPress(MotionEvent ev) {
if (childView != null && mListener != null) {
mListener.onLongClick(childView, touchView.getChildPosition(childView));
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
mGestureDetector.onTouchEvent(e);
childView = rv.findChildViewUnder(e.getX(), e.getY());
touchView = rv;
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
public interface OnItemClickListener {
void onItemClick(View view, int position);
void onLongClick(View view, int posotion);
}
}
2. 定义recyclerview添加方法 addOnItemTouchListener()
rc_view.addOnItemTouchListener(new RecyclerItemClickListener(this,new RecyclerItemClickListener.OnItemClickListener() {
public void onItemClick(View view, int position) {
//在此处做点击之后的逻辑处理
}
@Override
public void onLongClick(View view, int position) {
//在此处做长按之后的逻辑处理
Toast.makeText(getContext(), "长按", Toast.LENGTH_SHORT).show();
}
}