2015-04-17 100 views
8

在我们的应用程序中,我们列出了消息列表。我们正在切换到RecyclerView。 我们的信息可以来自文字,图像。 示例消息可以像这样。 enter image description here如何在Android中的recyclerView中处理多个布局点击次数

处理点击使用这个类:

public class RecyclerViewItemClickListener implement RecyclerView.OnItemTouchListener { 

    public static interface OnItemClickListener { 
     public void onItemClick(View view, int position); 
     public void onItemLongClick(View view, int position); 
    } 

    private OnItemClickListener mListener; 
    private GestureDetector mGestureDetector; 

    public RecyclerViewItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) { 
     mListener = listener; 
     mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
      @Override 
      public boolean onSingleTapUp(MotionEvent e) { 
       return true; 
      } 

      @Override 
      public void onLongPress(MotionEvent e) 
      { 
       View childView = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
       if(childView != null && mListener != null) 
       { 
        mListener.onItemLongClick(childView, recyclerView.getChildAdapterPosition(childView)); 
       } 
      } 
     }); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { 
     View childView = view.findChildViewUnder(e.getX(), e.getY()); 
     if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { 
      mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); 
     } 
     return false; 
    } 

    @Override 
    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { 
    } 
} 

,我们实现这个点击的活动是这样的:

chatView.setLongClickable(true); 
     chatView.addOnItemTouchListener(
       new RecyclerViewItemClickListener(this, chatView, new RecyclerViewItemClickListener.OnItemClickListener() { 
        @Override public void onItemClick(View view, int position) { 

         //handleSingleClick(view, position); 

        } 
        @Override 
        public void onItemLongClick(View view, int position) 
        { 
         handleLongPress(position); 
        } 
       }) 
     ); 

点击次数消息是工作,现在我想还处理userAvatar点击从相同的GestureDetection。是否可以检测从GestureDetector点击哪个列表项目布局?

换句话说,我可以得到GestureDetecter点击的孩子。在我的情况下,点击设置为整个项目(头像,短信,图片)。我可以检测到该项目内的哪个元素被点击过(例如,我想要抓住头像点击)。

回答

-1

点击需要RecyclerView的适配器进行处理,请访问类似RecyclerView例如像onItemClickListener的ListView

+0

为什么downvote !! – Sameer

0

你可以试试这个代码:

GestureDetector detector; 

则:

detector = new GestureDetector(MainActivity.this, MainActivity.this); 

    avatar.setOnTouchListener(new OnTouchListener() { 
     public boolean onTouch(View view, MotionEvent e) { 
      detector.onTouchEvent(e); 
      return false; 
     } 
    }); 
3

处理适配器中的点击您的RecyclerView如下所示:

private class BookmarkViewHolder extends RecyclerView.ViewHolder { 

     protected ImageView thumbnailIcon; 
     protected TextView postTitle; 
     protected TextView postViewCount; 

     public BookmarkViewHolder(View v) { 
      super(v); 

      thumbnailIcon = (ImageView) v.findViewById(R.id.thumbnailIcon); 
      postTitle = (TextView) v.findViewById(R.id.postTitleTV); 
      postViewCount = (TextView) v.findViewById(R.id.viewCountTV); 

      v.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) {             
       } 
      }); 

      thumbnailIcon.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) {             
       } 
      }); 

      postTitle.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) {             
       } 
      }); 


     } 
    } 
+0

如何在onClick调用中获得listitem的位置时使用此工作...这将无法在viewHolder方法中使用... – Lion789

+0

使用setTag()来设置像这样的项目位置... ........................................ public void onBindViewHolder(PostViewHolder postViewHolder,int i) { \t \t \t \t \t \t //点击项目时该标签将被用于... \t \t \t postViewHolder.postTitle.setTag(ⅰ); \t \t \t postViewHolder.postTitle.setTag(“TITLE”); } – user320676

0

您可以将侦听器设置为适配器类。下面是代码:内部适配器

ViewHolder类:

public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

    TextView textViewFirstName; 
    ImageView imageViewProfile; 

    public MyViewHolder(View view) { 
     super(view); 
     textViewFirstName = (TextView) view.findViewById(R.id.txtName); 
     imageViewProfile = (ImageView) view.findViewById(R.id.imageViewProfile); 

//setOnClick 
     view.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
    //check if the image you want to click should not invoke listener from activity/fragment 
     if (v.getId() != R.id.imageViewProfile) { 
      if (mItemClickListener != null) { 
       mItemClickListener.onItemClick(v, getPosition()); 
      } 
     } 
    } 
} 

设置你的ImageView单击适配器类onBindViewHolder:

@Override 
public void onBindViewHolder(MyViewHolder holder, final int position) { 

    holder.textViewFirstName.setText(mArrayListTypeDetials.get(position).getFirstname()); 
    //set imageView click here 
    holder.imageViewProfile.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //ImageView clicked 
     } 
    }); 
} 

创建适配器类的内部接口:

//interface for recyclerView item click 
public interface OnItemClickListener { 
    void onItemClick(View view, int position); 
} 

/* 
method to set listener to the adapter ViewHolder item 
*/ 
public void setOnItemClickListener(final OnItemClickListener mItemClickListener) { 
    this.mItemClickListener = mItemClickListener; 
} 

从活动/片段设置界面:

mAdapter.setOnItemClickListener(new Adapter.OnItemClickListener() { 
     @Override 
     public void onItemClick(View view, int position) { 
      Intent intent = new Intent(getActivity(), ABC.class); 
      startActivity(intent); 
     } 
    }); 
0

based on this post.

//init listener 
rVDevicesList.addOnItemTouchListener(new RecyclerItemClickListener(getContext(), 
      rVDevicesList, 
      this, R.id.tv_wonderful_item_share, R.id.tv_wonderful_item_delete)); 




public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { 

private OnItemClickListener mListener; 
private int[] extraIds; 
private Rect childRect = new Rect(); 

public interface OnItemClickListener { 
    void onItemClick(View view, int position); 

    void onLongItemClick(View view, int position); 
} 

private GestureDetector mGestureDetector; 

/** 
* 
* @param context 
* @param recyclerView 
* @param listener 
* @param ids: an alternative parameter 
*/ 
public RecyclerItemClickListener(Context context, 
           final RecyclerView recyclerView, 
           OnItemClickListener listener, final int... ids) { 
    mListener = listener; 
    extraIds = ids; 
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onSingleTapUp(MotionEvent e) { 
      return true; 
     } 

     @Override 
     public void onLongPress(MotionEvent e) { 
      View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
      if (child != null && mListener != null) { 
       mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child)); 
      } 
     } 
    }); 
} 

@Override 
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { 
    final float x = e.getX(); 
    final float y = e.getY(); 
    Log.d("onInterceptTouchEvent", "onInterceptTouchEvent: " + x + " " + y); 
    View childView = view.findChildViewUnder(e.getX(), e.getY()); 
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { 
     final int position = view.getChildAdapterPosition(childView); 
     View target = getViewBy(childView, x, y, extraIds); 
     //if target is non-null,so you click the view. 
     mListener.onItemClick(target, position); 
     return true; 
    } 
    return false; 
} 

/** 
* find the view ,which view_rect contains the {x,y} in the window. 
* @param view: this view is item layout view,may be a viewGroup 
* @param x 
* @param y 
* @param ids 
* @return true: hit a view which id in ids. 
*/ 
private View getViewBy(View view, float x, float y, int... ids) { 
    if (ids == null || ids.length == 0 || !(view instanceof ViewGroup)) 
     return view; 
    for (int i : ids) { 
     View vChild = view.findViewById(i); 
     if (vChild == null) { 
      Log.d("onInterceptTouchEvent", "null"); 
     } else { 
      int xy[] = new int[2]; 
      vChild.getLocationOnScreen(xy); 
      childRect.left = xy[0]; 
      childRect.top = xy[1]; 
      childRect.right = xy[0] + vChild.getWidth(); 
      childRect.bottom = xy[1] + vChild.getHeight(); 
      boolean hit = childRect.contains((int) x, (int) y); 
      Log.d("onInterceptTouchEvent", "find view: " + hit); 
      if (hit) 
       return vChild; 
     } 
    } 
    return view; 
} 

@Override 
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { 

} 

@Override 
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 
} 

}

+2

你应该真的添加一些关于为什么这个代码应该工作的解释 - 你也可以在代码本身中添加注释 - 以它当前的形式,它没有提供任何可以帮助社区的其他人了解你做了什么的解释解决/回答问题。 – ishmaelMakitla

0

我试着像@ user320676同样的方式,但我试图用一个监听器来完成:

interface MultipleClickListener { 
     void onItemClickOne(int position, View v); 
     void onItemClickTwo(int position, View v); 
     void onItemClickThree(int position, View v); 
} 

,那么你可以使用听众在一个活动或片段。在这里你可以看到我的全部适配器:

public class MultipleClicksAdapter extends RecyclerView 
     .Adapter<MultipleClicksAdapter 
     .DataObjectHolder> { 

    private ArrayList<MultipleClickData> mDataset; 
    private static MultipleClickListener sClickListener; 

    static class DataObjectHolder extends RecyclerView.ViewHolder { 

     @BindView(R.id.multiple_clicks_one_textView) 
     TextView mOne; 
     @BindView(R.id.multiple_clicks_two_textView) 
     TextView mTwo; 
     @BindView(R.id.multiple_clicks_three_textView) 
     TextView mThree; 

     DataObjectHolder(View itemView) { 
      super(itemView); 

      ButterKnife.bind(this, itemView); 

      mOne.setOnClickListener((View v) -> 
        sClickListener.onItemClickOne(getAdapterPosition(), mOne)); 

      mTwo.setOnClickListener((View v) -> 
        sClickListener.onItemClickTwo(getAdapterPosition(), mTwo)); 

      mThree.setOnClickListener((View v) -> 
        sClickListener.onItemClickThree(getAdapterPosition(), mThree)); 
     } 

    } 

    void setOnItemClickListener(MultipleClickListener myClickListener) { 
     this.sClickListener = myClickListener; 
    } 

    MultipleClicksAdapter(ArrayList<MultipleClickData> myDataset) { 
     mDataset = myDataset; 
    } 

    @Override 
    public MultipleClicksAdapter.DataObjectHolder onCreateViewHolder(ViewGroup parent, 
                      int viewType) { 
     View view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.multiple_clicks_list_item, parent, false); 

     MultipleClicksAdapter.DataObjectHolder dataObjectHolder = new MultipleClicksAdapter.DataObjectHolder(view); 
     return dataObjectHolder; 
    } 

    @Override 
    public void onBindViewHolder(MultipleClicksAdapter.DataObjectHolder holder, int position) { 
     holder.mOne.setText(mDataset.get(position).getmTitle()); 
     holder.mTwo.setText(mDataset.get(position).getmSubTitle()); 
     holder.mThree.setText(mDataset.get(position).getmThirdTitle()); 
    } 

    @Override 
    public int getItemCount() { 
     return mDataset.size(); 
    } 

    interface MultipleClickListener { 
     void onItemClickOne(int position, View v); 
     void onItemClickTwo(int position, View v); 
     void onItemClickThree(int position, View v); 
    } 

} 

你也可以检查complete code in GitHub

相关问题