Sau nhiều giờ nghiên cứu, tôi cuối cùng đã tư vấn trợ giúp chính thức.RecyclerView.onBindViewHolder được gọi chỉ một lần
Tôi có RecyclerView.Adapter và RecyclerView.ViewHolders hoạt động hoàn hảo. Nhưng vì một số lý do tôi không hiểu, RecyclerView.Adapter.onBindViewHolder không được gọi đúng cách.
private class AttendeeAdapter extends RecyclerView.Adapter<AttendeeHolder> {
/*FIELDS*/
private List<Attendee> mAttendeeList;
/*CONSTRUCTORS*/
public AttendeeAdapter(List<Attendee> attendees) {
mAttendeeList = attendees;
//Log.i(TAG, "AttendeeAdapter size: " + getItemCount());
}
Dựa trên thông điệp tường trình (mục được tính là kích thước của danh sách như mong đợi), tôi cho rằng AttendeeAdapter đã được tạo đúng cách.
Vì vậy, tôi mong đợi phương thức onBindViewHolder (VH, int) sẽ được gọi nhiều lần như kích thước của Danh sách nhưng nó không phải là. Phương thức này chỉ được gọi là ONCE!
/*METHODS*/
@Override
public AttendeeHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
View itemView = layoutInflater.inflate(R.layout.list_attendee, parent, false);
return new AttendeeHolder(itemView);
}
@Override
public void onBindViewHolder(AttendeeHolder holder, int position) {
Attendee attendee = mAttendeeList.get(position);
holder.bindAttendee(attendee, position);
Log.i(TAG, "Binding ViewHolder #" + position);
/* Binding ViewHolder #0 and that's it */
}
@Override
public int getItemCount() {
return mAttendeeList.size();
}
}
AttendeeHolder của tôi (mở rộng RecyclerView.ViewHolder) diễn ra như sau:
private class AttendeeHolder extends RecyclerView.ViewHolder {
/*FIELDS*/
private EditText mAttendeeNameEditText;
private Attendee mAttendee;
/*CONSTRUCTOR*/
public AttendeeHolder(View itemView) {
super(itemView);
mAttendeeNameEditText = (EditText) itemView.findViewById(R.id.edit_text_list_item);
mAmountEditTextList = new ArrayList<>(eventMaxCount);
}
/*METHODS*/
public void bindAttendee(Attendee attendee, final int position) {
mAttendee = attendee;
String attendeeName = mAttendee.getName();
// Set the name to the EditText if a name has already been set
if (attendeeName != null) {
mAttendeeNameEditText.setText(attendeeName);
}
}
}
và triển khai trong mã chính như
List<Attendee> attendees = AttendeeLab.get().getAttendeeList();
mAttendeeAdapter = new AttendeeAdapter(attendees);
mAmountRecyclerView.setAdapter(mAttendeeAdapter);
Tôi đoán mã sẽ làm việc (tôi nghĩ Tôi đã không thực hiện bất kỳ thay đổi nào) nhưng phụ thuộc gradle có thể không được đặt đúng. Đó là nơi tôi đã cố gắng sửa đổi recyclerview-v7: 23.3.0 để recyclerview-v7: 23.1.0 hoặc bất cứ điều gì (Không ai trong số họ làm việc).
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:design:23.3.0'
compile 'com.android.support:support-v4:23.3.0'
compile 'com.android.support:recyclerview-v7:23.1.2'
}
Mọi trợ giúp hoặc nhận xét sẽ được đánh giá cao. Tôi ước tôi sẽ nói lời tạm biệt với cơn đau đầu sau vài giờ kể từ bây giờ.
Không chắc chắn nếu nó có nghĩa là bất cứ điều gì - nhưng làm thế nào để bạn truy cập vào 'của bạn AttendeeHolder', vì nó có tin accessand nó không nằm trong 'AttendeeAdapter' .. của bạn? Ngoài ra, sử dụng cùng một phiên bản cho các gói hỗ trợ trong 'build.gradle' của bạn. – yennsarah
ViewHolder và Adapter là các lớp bên trong trong mã chính do đó có thể truy cập được. – SHAHM
Bạn đã giải quyết được sự cố!RecyclerViews đang hoạt động đúng cách sử dụng cùng một phiên bản (cũ) cho các gói hỗ trợ, tức là v7: 23.1.2. Tôi xin lỗi vì tôi có hiểu biết kém về cách Gradle hoạt động, nhưng liệu nó có hoạt động theo cách đó không? Điều gì xảy ra nếu tôi khăng khăng sử dụng RecyclerViews với thư viện recyclerview-v7: 23.3.0 mới? – SHAHM