После многих часов исследований я наконец консультирую официальную помощь.
У меня есть RecyclerView.Adapter и RecyclerView.ViewHolders, которые отлично работали. Но по некоторым причинам я не понимаю, RecyclerView.Adapter.onBindViewHolder не называется должным образом.
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());
}
На основании сообщения журнала (элемент подсчитывается как размер списка, как ожидалось), я предполагаю, что AttendeeAdapter был правильно создан.
Поэтому я ожидаю, что метод onBindViewHolder (VH, int) будет вызываться столько раз, сколько размер списка, но это не так. Этот метод называется только 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 it */
}
@Override
public int getItemCount() {
return mAttendeeList.size();
}
}
Мой AttendeeHolder (расширение RecyclerView.ViewHolder) выглядит следующим образом:
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);
}
}
}
и реализован в основном коде как
List<Attendee> attendees = AttendeeLab.get().getAttendeeList();
mAttendeeAdapter = new AttendeeAdapter(attendees);
mAmountRecyclerView.setAdapter(mAttendeeAdapter);
Я думаю, что код будет работать (я думаю, что я не внес никаких изменений), но зависимости gradle могут быть неправильно установлены. Вот где я попытался изменить recyclerview-v7: 23.3.0 на recyclerview-v7: 23.1.0 или что-то еще (Ни один из них не работал).
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'
}
Любая помощь или комментарий будут оценены. Хотел бы я попрощаться с головной болью через несколько часов.