【发布时间】:2016-08-18 19:31:54
【问题描述】:
经过数小时的研究,我终于咨询了官方帮助。
我有一个完美运行的 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 的大小一样多,但事实并非如此。该方法只调用一次!
/*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'
}
任何帮助或评论将不胜感激。我希望我能在几个小时后告别头痛。
【问题讨论】:
-
不确定这是否意味着什么 - 但是您如何访问您的
AttendeeHolder,因为它具有私有访问权限并且它不位于您的AttendeeAdapter..?此外,对您的build.gradle中的支持包使用相同的版本。 -
ViewHolder 和 Adapter 是主代码中的内部类,因此可以访问。
-
你解决了这个问题! RecyclerViews 使用相同(旧)版本的支持包正常工作,即 v7:23.1.2。很抱歉,我对 Gradle 的工作原理了解甚少,但它应该以这种方式工作吗?如果我坚持将 RecyclerViews 与新的 recyclerview-v7:23.3.0 库一起使用怎么办?
标签: android dependencies android-recyclerview android-studio-2.0