RecyclerView item內部點選事件、item點選事件衝突
阿新 • • 發佈:2019-01-02
1.recyclerview item內部控制元件沒有點選事件
在recyclerview item內部控制元件不存在點選事件的情況下。item設定點選事件可通過新增觸控事件
recyclerview.addOnItemTouchListener();//為item新增觸控事件監聽
OnItemTouchListener 的相應定義
/**處理類*/
private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener {
public boolean onSingleTapUp (MotionEvent event){
View child = recyclerView.findChildViewUnder(event.getX(), event.getY());
if (child != null){
RecyclerView.ViewHolder viewHolder = recyclerView.getChildViewHolder(child);
onItemClick(viewHolder);
}
return true;
}
public void onLongPress(MotionEvent event){
View child = recyclerView.findChildViewUnder(event.getX(), event.getY());
if (child != null){
RecyclerView.ViewHolder viewHolder = recyclerView.getChildViewHolder(child);
onItemLongClick(viewHolder);
}
}
}
/**通用recyclerView item點選事件實現*/
public abstract MyItemClickListener implments RecylerView.OnItemTouchListener{
//view
private final RecyclerView recyclerView;
//手勢識別類
private final GestureDetectorCompat mGestureDetector;
public MyItemClickListener(RecyclerView recyclerView){
this.recyclerView = recyclerView;
mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(),new ItemTouchHelperGestureListener());
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
mGestureDetector.onTouchEvent(e);
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
mGestureDetector.onTouchEvent(e);
return false;
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
//直接將上面的類寫作內部類並呼叫下方的方法。
public abstract void onItemClick(RecyclerView.ViewHolder viewHolder);
public abstract void onItemLongClick(RecyclerView.ViewHolder viewHolder);
}
此方法只適用於item 內部控制元件無監聽事件。
2.item 內部控制元件點選事件
此種情況針對內部item有監聽事件
介面卡中通過實現點選事件、長按事件來實現item的點選、長按事件。
//監聽器 這裡方便設定呼叫點選、長按事件直接寫在一個監聽類中
public interface MyItemClickListener{
void onItemClick();
void onItemLongClick();
}
//介面卡
MyItemClickListener listener=null;
onCreateViewHolder() 中設定點選、長按事件。
v.setOnClickListener(this);
v.setOnLongClickListener(this);
onBindViewHolder()方法中
為view設定tag;
holder.itemView.setTag(position);
呼叫方法設定
public void setOnItemListener(MyItemClickListener listener){
this.listener=listener;
}
@Override
public void onClick(View v) {
if(listener!=null){
listener.onItemClick
}
}
直接在adapter例項之後進行事件的呼叫。在相對應的地方try{}catch(Exception e){}
以上為實際編碼中遇到的事件傳遞問題的解決。