2015-04-20 19 views
15

Tôi đang tải danh sách các Danh mục và tùy thuộc vào danh mục nào được chọn, tôi cần hiển thị các sản phẩm thuộc danh mục tương ứng trong số RecyclerView. Vì vậy, khi tôi lần đầu tiên bắt đầu Fragment tôi cần phải mô phỏng người dùng nhấp vào một danh mục mặc định trong trường hợp này, nó sẽ là người đầu tiên.Nhấp vào mục lập trình trong RecyclerView

Tôi làm cách nào để thực hiện việc này?

Cảm ơn rất nhiều trước.

Trả lời

16

Nếu không có mã của bạn, chúng tôi không biết cách bạn triển khai onClickListener của mình.

Thông thường, bạn triển khai và đặt mục onClickListener trong chế độ xemChính sách của RecyclerView.Adapter của bạn.
Ví dụ: ViewHolder.itemView.setOnClickListener(listener);

Vì vậy, giải pháp là bạn có thể sử dụng recyclerView.findViewHolderForAdapterPosition(0).itemView.performClick()

PS: Không sử dụng findViewHolderForLayoutPosition() theo Doc

9

Dưới đây là một cách giải quyết để chọn con 1 của recyclerview chỉ sau thiết lập bộ chuyển đổi , hy vọng nó sẽ giúp bạn

//position to be clicked 
final int pos = 0; 
new Handler().postDelayed(new Runnable() { 
        @Override 
        public void run() { 
recyclerView.findViewHolderForAdapterPosition(pos).itemView.performClick(); 
        } 
       },1); 

thích :)

+1

Tại sao bạn đề nghị để sử dụng xử lý ở đây? – Gaket

+1

Để trì hoãn 1 ms trên sự kiện nhấp chuột vì đôi khi nó đã đưa ra một ngoại lệ con trỏ null. – Saurabh

+0

Cậu bé này đúng ... giải quyết ngoại lệ con trỏ null –

0

Nó được tán thành bởi chủ nghĩa thuần túy để sử dụng phương pháp

recyclerView.findViewHolderForAdapterPosition(pos).itemView.performClick(); 

vì nó khẳng định trong tài liệu:

Return the ViewHolder for the item in the given position of the data set. Unlike 
* {@link #findViewHolderForLayoutPosition(int)} this method takes into account any pending 
* adapter changes that may not be reflected to the layout yet. On the other hand, if 
* {@link Adapter#notifyDataSetChanged()} has been called but the new layout has not been 
* calculated yet, this method will return <code>null</code> since the new positions of views 
* are unknown until the layout is calculated. 

cho chính xác lý do mà trì hoãn với một sợi đôi khi hữu ích. Bất kỳ cuộc gọi nào để thông báoDataSetChanged() đều làm cho nó trả về null. Tốt hơn để sử dụng phương pháp bộ điều hợp onBindViewHolder và kiểm tra vị trí 0. Điều chỉnh cách bạn đã thiết lập trình nghe, ví dụ usual way ở đây, được tạo trong hàm tạo ViewHolder. Sử dụng một biến init để ngăn chặn nó được gọi là một lần nữa:

@Override 
    public void onBindViewHolder(FooAdapter.ViewHolder viewHolder, int position) { 
    //code 
    ... 
    //do this last especially if you are using an animator 

    if(position == 0 && isInit) { 
     listener.onItemClick(viewHolder.itemView,0); 
     isInit =false; 

    } 
    } 
0

nếu bạn muốn bấm một cái nhìn đặc biệt bên trong một hàng tại vị trí sau đó sử dụng

recyclerView.findViewHolderForAdapterPosition(pos).itemView.findViewById(R.id.view_id).performClick(); 
Các vấn đề liên quan