Java 带光标的RecylerView中的节

Java 带光标的RecylerView中的节,java,android,android-recyclerview,android-cursor,Java,Android,Android Recyclerview,Android Cursor,我读过很多关于这个问题的StackOverflow帖子,但大多数帖子都没有使用游标作为RecyclerView的数据源。但我的应用程序确实如此 在我的应用程序中,我查询数据库,结果如下图所示。结果按\u 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

我读过很多关于这个问题的StackOverflow帖子,但大多数帖子都没有使用游标作为
RecyclerView
的数据源。但我的应用程序确实如此

在我的应用程序中,我查询数据库,结果如下图所示。结果按\u 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
正如您所看到的,它形成了带有标题的组,并且在每个标题下都有相关的项目

我创建了两种不同的布局

标题及其下方的项目布局


当您向上滚动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;
}

您是否会显示适配器的
getItemCount
方法?我只是为getItemCount()返回cursor.getCount()是的,这样我就不需要依赖lastGroupId变量,它实际上不代表最后一个组的id,就像RecyclerView进行优化一样,lastGroupId为项目获取无效值。
<?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 {
    }

}
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;
}