我已经阅读了很多有关此类问题的StackOverflow帖子,但是其中大多数都没有将游标用作RecyclerView
的数据源。但是我的应用程序可以。
在我的应用程序中,我查询数据库,结果如下图所示。结果按 _id 列排序。
我希望我的RecyclerView
代表如下数据:
White Blood Cell(WBC)
52 10^9/L 2018-08-15
52 10^9/L 2018-08-15
52 10^9/L 2018-08-15
Red Blood Cell - Male
52 10^9/L 2018-08-15
52 10^9/L 2018-08-15
52 10^9/L 2018-08-15
如您所见,它形成带有标题的组,并且相关项目位于每个标题下。
我创建了两种不同的布局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout>
<TextView
android:id="@+id/heading"" />
<LinearLayout>
<TextView
android:id="@+id/value" />
<TextView
android:id="@+id/date" />
</LinearLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout>
<TextView
android:id="@+id/value" />
<TextView
android:id="@+id/date"/>
</LinearLayout>
忽略布局文件中缺少的详细信息
另一方面,我的适配器执行以下操作。
public class BloodTestRecordAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
// it holds the _id of the last group
private int lastGroupId = -1;
private final int VIEW_TYPE_HEADING = 0, VIEW_TYPE_ITEM = 1;
@Override
public int getItemViewType(int position) {
int returnItemViewType;
// get _id value for the row at given position
int currentGroupId = getCursorAtPosition(position).getInt(0);
if (currentGroupId != lastGroupId) {
// return VIEW_TYPE_HEADING
lastGroupId = currentGroupId;
returnItemViewType = VIEW_TYPE_HEADING;
} else {
returnItemViewType = VIEW_TYPE_ITEM;
}
return returnItemViewType;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder viewHolder;
View view;
if (viewType == VIEW_TYPE_HEADING) {
// inflate HEADING LAYOUT
} else {
// inflate item layout
}
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, Cursor cursor, int position) {
if (viewHolder.getItemViewType() == VIEW_TYPE_HEADING) {
// bind values to heading layout
} else {
// bind values to item layout
}
}
public class HeadingViewHolder extends RecyclerView.ViewHolder {
}
public class ItemViewHolder extends RecyclerView.ViewHolder {
}
}
我在getItemViewType中所做的工作是通过使用传递给方法的position参数来检查_id列是否与lastGroupId匹配。如果匹配,我只返回VIEW_TYPE_ITEM,这是正常的项目布局。
如果不匹配,则表明它是另一个组的开始,因此在这种情况下,我返回VIEW_TYPE_HEADING。
它可以正常工作,但是随着我获得更多物品,物品在组下的标题和位置似乎不正确。有时,某些项目的标题布局会消失,如下图所示。
我确定我实现getViewItemType的方式不是 是的,我还知道,由于该lastGroupId变量,我的视图持有者被回收了,它与我的getViewItem方法混在一起了。
您能给我一些建议吗,或者我应该怎么做才能通过Cursor在RecyclerView
中实现这些目标,或者我有什么错误?
答案 0 :(得分:1)
当您向上滚动recyclerView时出现问题,因此lastGroupId
无法正确填充。
使用此逻辑代替getItemViewType
中的当前代码:
if (position == 0) {
return VIEW_TYPE_HEADING;
} else {
int currentGroupId = getCursorAtPosition(position).getInt(0);
int previousGroupId= getCursorAtPosition(position - 1).getInt(0);
return currentGroupId != previousGroupId ? VIEW_TYPE_HEADING : VIEW_TYPE_ITEM;
}