2014-07-03 20 views
10

Tôi đã chơi xung quanh với RecyclerView một chút. Có cách nào dễ dàng để đặt OnClickListener cho các mặt hàng trong RecyclerView không? Tôi đã thử triển khai nó trong ViewHolder. Sự kiện onClick chưa bao giờ được kích hoạt.Những thách thức trong RecyclerView của Android L

Và tôi đã sử dụng notifyItemInserted(position) để thêm giá trị mới vào RecyclerView. Giao diện người dùng không được làm mới tự động. Cần phải kéo lên và xuống để làm mới. Nhưng khi tôi gọi notifyDatasetChanged(..), nó là ok.

Tôi đã áp dụng DefaultItemAnimator đến RecyclerView. Nhưng, không thấy bất kỳ hoạt ảnh nào khi mục mới được thêm vào.

Xin cảm ơn trước vì bất kỳ ý tưởng nào.

Đây là thành phần Android L đầu tiên tôi đã thử nghiệm và tôi đang mắc kẹt ở đó.

Đây là lớp Adaptor của tôi:

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

private List<String> arrExperiences; 

//Provide a reference to the type of views that you are using - Custom ViewHolder 
public class MyViewHolder extends RecyclerView.ViewHolder { 

    public TextView tvExperienceTitle; 
    public TextView tvExperienceDesc; 

    public MyViewHolder(RelativeLayout itemView) { 
     super(itemView); 
     tvExperienceTitle = (TextView) itemView.findViewById(R.id.tv_experience_title); 
     tvExperienceDesc = (TextView) itemView.findViewById(R.id.tv_experience_desc); 
    } 

} 

//Provide a suitable constructor : depending on the kind of dataset. 
public AdapterRecyclerView(List<String> arrExperiences){ 
    this.arrExperiences = arrExperiences; 
} 

//Create new view : invoke by a Layout Manager 
@Override 
public AdapterRecyclerView.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    RelativeLayout view = (RelativeLayout) LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item_recycler, parent, false); 
    MyViewHolder myViewHolder = new MyViewHolder(view); 
    return myViewHolder; 
} 

@Override 
public void onBindViewHolder(AdapterRecyclerView.MyViewHolder viewHolder, int position) { 
    //get element from your dataset at this position. 
    //replace the content of the view with this element. 
    viewHolder.tvExperienceTitle.setText(arrExperiences.get(position)); 
} 

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

public void addExperience(String experience, int position){ 
    arrExperiences.add(position, experience); 
    notifyItemInserted(position); 
    //notifyDataSetChanged(); 
} 

public void removeExperience(){ 
    int index = (int) (Math.random() * arrExperiences.size()); 
    arrExperiences.remove(index); 
    notifyItemRemoved(index); 
    //notifyDataSetChanged(); 
} 
} 
+3

Bạn có thể thử https://gist.github.com/grantland/cd70814fe4ac369e3e92 – CommonsWare

+0

này được chính xác tôi đã nói ở trên. Anh chàng đó đang triển khai OnClickListener từ ViewHolder. Tôi đã thử nó. Nhưng, sự kiện onClick chưa bao giờ được kích hoạt. –

+0

Mã của anh ta gọi là 'setOnClickListener() '. Của bạn hiển thị ở trên không. – CommonsWare

Trả lời

0

hãy xem câu trả lời của tôi here. Bạn cần một lớp phụ (có thể được bao gồm như là một phần của bản phát hành đầy đủ) nhưng nó sẽ cho phép bạn tạo OnItemClickListeners theo cách bạn đang sử dụng để cho ListViews.

0

Here bạn nhận được một lớp Adaptor đơn giản có thể thực hiện sự kiện onItemClick trên mỗi hàng danh sách cho recyclerview.

0

Vì bạn vẫn không đánh dấu đúng bất kỳ câu trả lời nào, và ngay cả khi đó là câu hỏi cũ, tôi sẽ cố gắng cung cấp cách tôi làm. Tôi nghĩ nó rất sạch sẽ và chuyên nghiệp. Các chức năng được lấy từ các blog khác nhau (tôi vẫn phải đề cập đến chúng trong trang), sáp nhập và phương pháp đã được cải thiện cho tốc độ và khả năng mở rộng, cho tất cả các hoạt động sử dụng RecycleView.

https://github.com/davideas/FlexibleAdapter

  • Tại tầng lớp hạ lưu có SelectableAdapter cung cấp các chức năng lựa chọn và nó có thể duy trì trạng thái sau khi luân chuyển, bạn chỉ cần gọi onSave/onRestore phương pháp từ hoạt động này.
  • Sau đó, lớp FlexibleAdapter xử lý nội dung với sự hỗ trợ của hình động (gọi thông báo chỉ cho vị trí. Lưu ý: bạn vẫn cần đặt hoạt ảnh của mình thành RecyclerView khi bạn tạo hoạt động).
  • Sau đó, bạn cần mở rộng lại lớp học này. Ở đây bạn thêm và thực hiện các phương thức như bạn muốn cho ViewHolder của riêng bạn và lớp Miền/Mô hình của bạn (trình giữ dữ liệu). Lưu ý: Tôi đã cung cấp một ví dụ không biên dịch vì bạn cần thay đổi các lớp học với các lớp bạn có trong dự án của mình.

Tôi nghĩ rằng, đó là ViewHolder nên giữ người nghe của các nhấp chuột và nó nên được thực hiện lúc tạo và không phải trong phương pháp ràng buộc (được gọi là tại mỗi hiệu lực từ thông báo ...()).

Cũng lưu ý rằng bộ điều hợp này xử lý các nhấp chuột cơ bản: nhấp chuột đơn và dài, nếu bạn cần nhấn đúp, bạn cần sử dụng cách trả lời Jabob Tabak does.

Tôi vẫn phải cải thiện nó, vì vậy hãy theo dõi nó. Tôi cũng muốn thêm một số chức năng mới như Hoàn tác.

1

Chỉ cần thêm này trong Adaptor của bạn:

@Override 
public void onBindViewHolder(AdapterRecyclerView.MyViewHolder viewHolder, int position) { 
    yourItems.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //do your stuff 
     } 
    }); 
} 
Các vấn đề liên quan