recyclerview自身不带有点击事件的回调,以下实现recyclerview点击事件的两种方式
1、通过接口回调的方式:
直接上代码加注释
1、首先定义点击的接口
import android.view.View;
//点击事件接口回调
public interface OnItemClickListener{
void onItemClick(View view, int position);
}
2、在recyclerview的adapter中实现点击方法
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> {
public OnItemClickListener mOnItemClickListener;//声明接口
public void setOnItemClickListener(OnItemClickListener onItemClickListener ){
mOnItemClickListener=onItemClickListener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.fragment_card, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.mItem = mValues.get(position);
holder.mTimeView.setText(mValues.get(position).time);
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (null != mListener) {
// Notify the active callbacks interface (the activity, if the
// fragment is attached to one) that an item has been selected.
mListener.onListFragmentInteraction(holder.mItem);
}
}
});
if (mOnItemClickListener != null) {
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getLayoutPosition();
mOnItemClickListener.onItemClick(holder.mView,position);
}
});
}
}
@Override
public int getItemCount() {
return mValues.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public final View mView;
public final TextView mTimeView;
public DummyItem mItem;
public ViewHolder(View view) {
super(view);
mView = view;
mTimeView = (TextView) view.findViewById(R.id.certLibFileTime);
}
}
}
3、在activity中使用
CardAdapter cardAdapter = new CardAdapter(CardDummyContent.ITEMS, mListener,context);
cardAdapter.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(View view, int position) {
String fileName = CardDummyContent.ITEMS.get(position).time;
Log.i(TAG,"cardName:"+fileName);
}
});
2,通过recyclerview的addOnItemTouchListener实现点击事件
1、首先定义类RecyclerItemClickListener实现 RecyclerView.OnItemTouchListener接口,重写onLongPress()方法,onInterceptTouchEvent()方法,onTouchEvent()方法,onRequestDisallowInterceptTouchEvent()方法,并在本类内部定义一个点击监听的接口interface OnItemClickListener,接口内部设置两个方法onItemClick(),onLongClick()。
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));
}
}
});
}
public interface OnItemClickListener {
void onItemClick(View view, int position);
void onLongClick(View view, int posotion);
}
@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) {
}
}
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();
}
}