17

Làm cách nào để có thể nhận được vị trí của mục được nhấp trong hàng RecyclerView và hơn là có ý định thực hiện một hoạt động theo phương pháp onClick? Đây là bộ chuyển đổi của tôi:RecyclerView: nhận vị trí và chuyển sang hoạt động

public class SergejAdapter extends RecyclerView.Adapter<SergejAdapter.MyViewHolder>{ 

    private LayoutInflater inflater; 
    List<Information> data= Collections.emptyList(); 

    public SergejAdapter(Context context, List<Information> data){ 
     inflater = LayoutInflater.from(context); 
     this.data=data; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = inflater.inflate(R.layout.navigation_drawer_custom_row,parent,false); 
     MyViewHolder holder= new MyViewHolder(view); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     Information current=data.get(position); 
     holder.title.setText(current.title); 
    } 

    @Override 
    public int getItemCount() { 
     return data.size(); 
    } 
    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     TextView title; 
     ImageView icon; 

     public MyViewHolder(View itemView){ 
      super(itemView); 
      title= (TextView) itemView.findViewById(R.id.listText); 
      icon = (ImageView) itemView.findViewById(R.id.listIcon); 
      icon.setOnClickListener(this); 
     } 

     @Override 
     public void onClick(View v) { 
      Context context = itemView.getContext(); 
      Intent intent = new Intent(context, Ernaehrung.class); 
      context.startActivity(intent); 

     } 
    } 

Ở đây tôi chỉ có một onClick khi một trong những hình ảnh được nhấp, nhưng mỗi hình ảnh có ý định tương tự.

+0

Kiểm tra bài này ra: http://stackoverflow.com/questions/26830505/create-a-listview-with-selectable-rows-change-background-color -loại danh sách-hàng. Nó kết hợp một số những điều này vào nó –

+3

getPosition() không được chấp nhận. Bạn phải sử dụng getLayoutPosition() hoặc getAdapterPosition(). Để tham khảo https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html –

Trả lời

58

Bạn có thể nhận được postion từ ViewHolder bằng cách sử dụng phương pháp getAdapterPosition(). Giống như trong đoạn mã sau:

public class SergejAdapter extends RecyclerView.Adapter<SergejAdapter.MyViewHolder>{ 

    ... 

    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 


     @Override 
     public void onClick(View v) { 
      // here you use position 
      int position = getAdapterPosition(); 
      ... 

     } 
    } 
} 
+0

Cảm ơn bạn đã trả lời nhanh! Tôi đã làm nó với trường hợp chuyển đổi, hoạt động tốt. – sergejdeveloper

+0

Hãy tính đến việc đặt vị trí thủ công là dự phòng hoặc công việc không cần thiết cụ thể hơn. – reVerse

+2

Điều này là sai. Trước hết, ViewHolder đã có một vị trí, do đó bạn không cần phải thêm nó. Thứ hai, vị trí onBind có thể không khớp với vị trí trong khi onClick (nếu các mục được di chuyển). Thay vào đó, hãy sử dụng 'ViewHolder # getPosition' để có được vị trí cập nhật. – yigit

1

Trong bạn onClick(View v) bạn chỉ có thể gọi getLayoutPosition() đó sẽ trở lại vị trí nơi mà các nhấp chuột đã xảy ra. Kiểm tra official docs để biết thêm thông tin.

Vì vậy, mã của bạn sẽ là một cái gì đó như thế này:

@Override 
public void onClick(View v) { 
    switch(getLayoutPosition()){ 
     //TODO 
    } 
} 

Tốt bạn nên sử dụng một giao diện để xử lý các nhấp chuột.

+0

'getPosition()' không được chấp nhận. Sử dụng 'getAdapterPosition()' để thay thế. –

+1

@joaquin Thay vì 'getPosition()', bây giờ chúng ta có 'getLayoutPosition()' và 'getAdapterPosition()'. Nếu bạn muốn có cùng một hiệu ứng, bạn nên gọi 'getLayoutPosition()' vì nó ánh xạ tới cùng một phương thức. 'getAdapterPosition()' thực hiện điều gì đó khác. – reVerse

+0

cảm ơn dữ liệu. Tôi nghĩ rằng getAdapterPosition() có cùng tác dụng. –

1

hoặc bạn chỉ có thể thêm:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder > { 

... 
    class MyViewHolder extends RecyclerView.ViewHolder { 

     public MyViewHolder (View itemView) { 
      super(itemView); 

      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Log.d(TAG, "Element " + getAdapterPosition() + " clicked."); 
       } 
      }); 
     } 


    } 
Các vấn đề liên quan