【问题标题】:Recylerview, CursorAdapter with Header views in betweenRecyclerview,CursorAdapter,中间有 Header 视图
【发布时间】:2017-05-19 09:52:41
【问题描述】:

我一直在使用 cursor 和 recyclerview。

我有一个查询的游标对象(从加载器传递)和一个标题字符串[]数组。

String headers[] = {"apples", "bananas"...};

现在我想将项目显示为

Apples
cursor row 1
cursor row 2
cursor row 3
Bananas
cursor row 4
cursor row 5

我不想使用 getItemCount() 方法进行调整。所以,计划传递一个适当长度的光标。

一种可能的方法是使用 MatrixCursor 和 MergeCursor 添加虚拟行,如下所述:Adding rows into Cursor manually。 这很好,但 MergeCursor 会一个接一个地对齐标题和光标数据。

想探索使用正确的标题和项目位置实现最终光标的方法。

【问题讨论】:

    标签: android listview android-recyclerview android-cursor


    【解决方案1】:

    您可以使用库SectionedRecyclerViewAdapter 将数据分组到各个部分,并为每个部分添加一个标题。

    首先创建一个Section类:

    class MySection extends StatelessSection {
    
        String title;
        List<String> list;
    
        public MySection(String title, List<String> list) {
            // call constructor with layout resources for this Section header, footer and items 
            super(R.layout.section_header, R.layout.section_item);
    
            this.title = title;
            this.list = list;
        }
    
        @Override
        public int getContentItemsTotal() {
            return list.size(); // number of items of this section
        }
    
        @Override
        public RecyclerView.ViewHolder getItemViewHolder(View view) {
            // return a custom instance of ViewHolder for the items of this section
            return new MyItemViewHolder(view);
        }
    
        @Override
        public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) {
            MyItemViewHolder itemHolder = (MyItemViewHolder) holder;
    
            // bind your view here
            itemHolder.title.setText(list.get(position));
        }
    
        @Override
        public RecyclerView.ViewHolder getHeaderViewHolder(View view) {
            return new SimpleHeaderViewHolder(view);
        }
    
        @Override
        public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) {
            MyHeaderViewHolder headerHolder = (MyHeaderViewHolder) holder;
    
            // bind your header view here
            headerHolder.tvItem.setText(title);
        }
    }
    

    然后你用你的部分设置 RecyclerView:

    // Create an instance of SectionedRecyclerViewAdapter 
    SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter();
    
    // Add your Sections to the adapter
    sectionAdapter.addSection(new MySection(headers[0], applesList));
    sectionAdapter.addSection(new MySection(headers[1], bananasList));
    
    // Set up your RecyclerView with the SectionedRecyclerViewAdapter
    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    recyclerView.setAdapter(sectionAdapter);
    

    使用上面的示例,您将不得不研究如何将您的 Cursor 转换为 List&lt;String&gt;,但您可以更改 MySection 类以接收 Cursor 而不是 List&lt;String&gt;

    【讨论】:

    • 有没有解决方案来解决如何使用带有 headerview 的 CursorAdapter 而无需自己进行转换?
    • Cursor 不太好用,因为所有的记录都是单一类型的,你会破坏 RecyclerView 的效率。
    猜你喜欢
    • 2014-09-11
    • 2016-01-29
    • 2012-11-17
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    相关资源
    最近更新 更多