11

Tôi đang sử dụng RecyclerView với bố cục hàng đơn với ImageView và TextView.Lấy vị trí của Chế độ xem trong onCreateViewHolder

Tôi muốn triển khai OnClickListener cho Chế độ xem chứ không phải cho các đối tượng ViewHolder riêng biệt. Làm cách nào để tôi có được vị trí của chế độ xem trong Bộ điều hợp?

Hiện tại tôi đang xóa nhận xét khi nhấp, nhưng tôi không thể chọn Chế độ xem được nhấp. Tôi đã thêm một TODO vào dòng thích hợp.

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

    /** List of Comment objects */ 
    private List<Comment> mCommentList; 

    /** Database with Comment objects */ 
    private CommentsDataSource mDataSource; 

    /** 
    * Construcutor for CommentAdapter 
    * 
    * @param commentList List of Comment objects 
    * @param dataSource Database with Comment objects 
    */ 
    public CommentAdapter(List<Comment> commentList, CommentsDataSource dataSource) { 
     this.mCommentList = commentList; 
     this.mDataSource = dataSource; 
    } 

    /** 
    * Add Comment objects to RecyclerView 
    * 
    * @param position The position where the Comment object is added 
    * @param comment Comment Object 
    */ 
    public void add(int position, Comment comment) { 
     mCommentList.add(position, comment); 
     notifyItemInserted(position); 
    } 

    /** 
    * Remove Comment objects from RecyclerView 
    * 
    * @param comment Comment Object 
    */ 
    public void remove(Comment comment) { 
     int position = mCommentList.indexOf(comment); 
     // Avoid double tap remove 
     if (position != -1) { 
      mCommentList.remove(position); 
      mDataSource.deleteComment(comment); 
      notifyItemRemoved(position); 
     } 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { 
     final View view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.single_line_row, parent, false); 
     view.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO get position 
       remove(mCommentList.get(getItemCount() - 1)); 
      } 
     }); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     final Comment comment = mCommentList.get(position); 
     holder.comment.setText(comment.getComment()); 
    } 

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

    public static class ViewHolder extends RecyclerView.ViewHolder { 

     /** ImageView icon */ 
     public ImageView icon; 

     /** TextView comment */ 
     public TextView comment; 

     /** 
     * Constructor for ViewHolder 
     * 
     * @param itemView Layout for each row of RecyclerView 
     */ 
     public ViewHolder(final View itemView) { 
      super(itemView); 
      icon = (ImageView) itemView.findViewById(R.id.icon); 
      comment = (TextView) itemView.findViewById(R.id.comment); 
     } 
    } 
} 
+0

bạn thực sự cần thiết OnClickListener của bạn trong ViewHolder (final Xem itemView) constructor, trong trường hợp đó ViewHolder nên thực hiện OnClickListener – pskink

Trả lời

31

Bạn không thể sử dụng position tham số của onBindViewHolder trong một callback. Nếu một mục mới được thêm ở trên, RecyclerView sẽ không rebind mục của bạn để vị trí là lỗi thời. Thay vào đó, RecyclerView cung cấp phương thức getAdapterPosition trên ViewHolder.

@Override 
public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { 
    final View view = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.single_line_row, parent, false); 
    final ViewHolder holder = new ViewHolder(view); 
    view.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final int position = holder.getAdapterPosition(); 
      if (position != RecyclerView.NO_POSITION) { 
       remove(mCommentList.get(position)); 
      } 
     } 
    }); 
    return holder; 
} 

Tôi đã thêm position != RecyclerView.NO_POSITION kiểm tra bởi vì khi mục được lấy ra, RecyclerView sẽ mờ dần View vì vậy nó vẫn có thể được bấm bởi người sử dụng nhưng vị trí bộ chuyển đổi của nó sẽ trở lại NO_POSITION.

+2

Bất cứ điều gì tôi nhấp vào, tôi nhận được vị trí -1 (RecyclerView.NO_POSITION), điều gì sẽ là vấn đề? – akki

-1

override phương pháp getItemViewType:

@Override 
public int getItemViewType(int position) { 
    //your code 
    return position; 
} 

Bây giờ vị trí có sẵn trên viewType

@Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     int position=viewType; 

     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recursive, parent, false); 
     return new ViewHolder(view); 
    } 
+5

Đừng làm điều này - nó sẽ làm cho Adapter tạo ra một cái nhìn mới cho mỗi mục trong danh sách của bạn hơn là tái chế chúng, vì nó sẽ nghĩ rằng chúng là tất cả các loại khác nhau. – starkej2

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