私はついに数時間の研究を経て、公式のヘルプに相談しました。RecyclerView.onBindViewHolderは一度だけ呼び出されます
私は完全に機能する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)メソッドがListのサイズの何倍も呼び出されると思いますが、そうではありません。メソッドは1回だけ呼び出されます!
/*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(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'
}
ご意見やご感想をお寄せください。私は今から数時間後に頭がおかしくなるといいと思う。
わからない - しかし、どのようにそれはそれプライベートaccessandを持っているので、あなたは、あなたの 'AttendeeHolder'にアクセスくださいあなたの 'AttendeeAdapter'にはありません..?また、 'build.gradle'のサポートパッケージにも同じバージョンを使用してください。 – yennsarah
ViewHolderとアダプタは、メインコード内の内部クラスにアクセス可能でした。 – SHAHM
あなたは問題を解決しました!RecyclerViewsは、サポートパッケージ(v7:23.1.2)と同じ(古い)バージョンを使用して正しく動作しています。 Gradleの仕組みについてよく理解していませんが、そのように動作するはずですか?新しいrecyclerview-v7:23.3.0ライブラリでRecyclerViewsの使用を主張するとどうなりますか? – SHAHM