2016-03-13 13 views
6

Một RecyclerView khác với một ListView vì nó không cung cấp lớp onItemCLickListener để xử lý các sự kiện nhấp chuột.Xác định onCLickListener của RecyclerView trong một Hoạt động

Điều này có thể được giải quyết nếu không có nhiều điều xảy ra đằng sau hậu trường khi một mục được nhấp, bằng cách xác định onClickListener trong ViewHolder. Điều gì sẽ xảy ra nếu văn bản hoặc bất kỳ nội dung nào phải được chuyển đến Hoạt động tiếp theo không thực sự tồn tại trong các chế độ xem mà ViewHolder có quyền truy cập, nhưng thay vào đó là một phần của Hoạt động có RecyclerView thì sao?

Trong trường hợp đó, onClickListener phải được triển khai bên trong hoạt động để văn bản có thể được chuyển tiếp. Điều đó là có thể.

  1. Một cách là thêm Chế độ xem ẩn giữ văn bản đó và sau đó thực hiện những gì đã được thực hiện trước đó; triển khai onClickListener trong Bộ điều hợp.

  2. Chuyển văn bản đó, bằng cách nào đó đến Bộ điều hợp.

Cách "2." được thực hiện?

+0

có thể trùng lặp của [RecyclerView onClick] (https://stackoverflow.com/questions/ 24471109/recyclerview-onclick) – Nexen

Trả lời

8

Viết một hàm nào trong hoạt động của bạn như:

public void onClickCalled(String anyValue) { 
    // Call another acitivty here and pass some arguments to it. 
} 

Bây giờ trong onClick của adapter của bạn funciton

@Override 
public void onClick(View view) { 
    ((YouActivityClass) context).onClickCalled("your argument here"); 
} 
+0

Vui lòng trả lời nếu giải quyết được sự cố của bạn –

+0

Cho tôi lỗi khi không thể chuyển ứng dụng sang lớp –

+0

gửi ngữ cảnh hoạt động của bạn đến bộ điều hợp, sau đó sử dụng bộ điều hợp này để gọi hoạt động –

1

Điều này có thể được giải quyết bằng cách tạo listener của riêng bạn và đi qua nó để adapter.

public interface PositionClickListener 
{ 
    void itemClicked(int position); 
} 

Hoạt động có thể triển khai giao diện này hoặc khởi tạo lớp bên trong ẩn danh. Vì vậy, bộ điều hợp của bạn có thể trông giống như sau:

public class MyRecyclerAdapter extends RecyclerView.Adapter 
{ 
    public final PositionClickListener listener; 

    public MyRecyclerAdapter(PositionClickListener listener) 
    { 
     this.listener = listener; 
    } 

    private void createView(int position) 
    { 
     View v = new View(); 
     v.setOnClickListener(new OnClickListener(){ 
      listener.itemClicked(position); 
     }); 
    } 
} 
0

Trường hợp ListView có onItemClickListener, RecyclerView có addOnItemTouchListener.

Bạn có thể cung cấp cho người nghe đến chế độ xem của người tái chế từ bên trong hoạt động, do đó phạm vi sẽ là để người nghe có thể tham khảo văn bản.

Bạn có thể sử dụng thứ gì đó như sau khi triển khai OnItemTouchListener cũng hoạt động để ghi lại các thao tác vuốt trái và phải.

public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { 

    private static final String TAG = "RecyclerTouchListener"; 

    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 

    private OnTouchActionListener mOnTouchActionListener; 
    private GestureDetectorCompat mGestureDetector; 

    public static interface OnTouchActionListener { 
     public void onLeftSwipe(View view, int position); 
     public void onRightSwipe(View view, int position); 
     public void onClick(View view, int position); 
    } 

    public RecyclerTouchListener(Context context, final RecyclerView recyclerView, 
          OnTouchActionListener onTouchActionListener){ 

     mOnTouchActionListener = onTouchActionListener; 
     mGestureDetector = new GestureDetectorCompat(context,new GestureDetector.SimpleOnGestureListener(){ 

     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) { 
      Log.d(TAG, "On Single Tap Confirmed"); 
      // Find the item view that was swiped based on the coordinates 
      View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
      int childPosition = recyclerView.getChildPosition(child); 
      mOnTouchActionListener.onClick(child, childPosition); 
      return false; 
     } 

     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, 
           float velocityX, float velocityY) { 
      Log.d(TAG, "onFling: " + e1.toString() + e2.toString()); 

      try { 
       if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) { 
        return false; 
       } 

       // Find the item view that was swiped based on the coordinates 
       View child = recyclerView.findChildViewUnder(e1.getX(), e1.getY()); 
       int childPosition = recyclerView.getChildPosition(child); 

       // right to left swipe 
       if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 

        Log.d(TAG, "Left Swipe"); 
        if (mOnTouchActionListener != null && child != null) { 
         mOnTouchActionListener.onLeftSwipe(child, childPosition); 
        } 

       } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
        Log.d(TAG, "Right Swipe"); 
        if (mOnTouchActionListener != null && child != null) { 
         mOnTouchActionListener.onRightSwipe(child, childPosition); 
        } 
       } 
      } catch (Exception e) { 
       // nothing 
      } 

      return false; 
     } 
    }); 
} 

    @Override 
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 
     mGestureDetector.onTouchEvent(e); 
     return false; 
    } 

    @Override 
    public void onTouchEvent(RecyclerView rv, MotionEvent e) { 
    } 

    @Override 
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 
     // do nothing 
    } 

} 

Sau đó, trong hoạt động của bạn thêm người nghe của bạn dọc theo dòng của

mRecyclerView.addOnItemTouchListener(
     new RecyclerTouchListener(getActivity(), mRecyclerView, 
      new RecyclerTouchListener.OnTouchActionListener() { 
       @Override 
       public void onClick(View view, int position) { 
       } 
       @Override 
       public void onRightSwipe(View view, int position) { 
       } 
       @Override 
       public void onLeftSwipe(View view, int position) { 
       } 
      })) 
14

Xem bên dưới ví dụ để tạo RecyclerViewOnClick.

Ví dụ Code:

public class ContentAdapter extends RecyclerView.Adapter<ContentAdapter.ViewHolder> { 

public interface OnItemClickListener { 
    void onItemClick(ContentItem item); 
} 

private final List<ContentItem> items; 
private final OnItemClickListener listener; 

public ContentAdapter(List<ContentItem> items, OnItemClickListener listener) { 
    this.items = items; 
    this.listener = listener; 
} 

@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item, parent, false); 
    return new ViewHolder(v); 
} 

@Override public void onBindViewHolder(ViewHolder holder, int position) { 
    holder.bind(items.get(position), listener); 
} 

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

static class ViewHolder extends RecyclerView.ViewHolder { 

    private TextView name; 
    private ImageView image; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     name = (TextView) itemView.findViewById(R.id.name); 
     image = (ImageView) itemView.findViewById(R.id.image); 
    } 

    public void bind(final ContentItem item, final OnItemClickListener listener) { 
     name.setText(item.name); 
     Picasso.with(itemView.getContext()).load(item.imageUrl).into(image); 
     itemView.setOnClickListener(new View.OnClickListener() { 
      @Override public void onClick(View v) { 
       listener.onItemClick(item); 
      } 
     }); 
    } 
} 
} 

Và Sử dụng RecyclerView Adapter sử dụng mã dưới đây:

recycler.setAdapter(new ContentAdapter(items, new ContentAdapter.OnItemClickListener() { 
@Override public void onItemClick(ContentItem item) { 
    Toast.makeText(getContext(), "Item Clicked", Toast.LENGTH_LONG).show(); 
} 
})); 

Xem Set a click listener to a RecyclerView

Hy vọng là giúp bạn.

0

nó dễ dàng, chúng tôi không có tạo ra các giao diện nhìn vào mã của tôi chỉ cần đặt mã nhỏ này và chúng tôi

@Override 
    public void onBindViewHolder(MyViewHolder holder, final int position) { 
     holder.img.setImageDrawable(img[position%img.length]); 
     holder.bodyPartName.setText(bodyPart[position]); 
     if(position==0) { 
      holder.itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Context c = v.getContext(); 
        Intent intent = new Intent(c, BodyPartExcercise.class); 
        c.startActivity(intent); 
       } 
      }); 
     } 
    } 
Các vấn đề liên quan