RecyclerView分组列表的实现及demo

1.RecyclerView 中实现分组的过程其实和ListView中分组的方式基本上是相同的。

2.为什么RecyclerView不能像ExpandableListView 中的数据那么容易一目了然的看出来应该是二维数组形式的数据展示模型。

3.具体请看下面的代码




private RecyclerView lisv_rootview;
private static final int TYPE_CONTENT = 0;
private static final int TYPE_HEAD = 1;
private static final int TYPE_FOOTER = 2;
private List<Bean> list;
private MyAdapter adapter;


@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_third);
    initView();
    list = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        Bean bean = new Bean();
        List<String> lis = new ArrayList<>();
        for (int j = 0; j < i; j++) {
            lis.add(i + "=" + j);
        }
        bean.setDataList(lis);
        bean.setHeader(i + "+head");
        bean.setFooter(i + "footer");
        list.add(bean);
    }




    adapter = new MyAdapter();
    lisv_rootview.setLayoutManager(new LinearLayoutManager(this));
    lisv_rootview.setAdapter(adapter);
}

private void initView() {
    lisv_rootview = (RecyclerView) findViewById(R.id.lisv_rootview);
}


private class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {


    private TextView textView_content;
    private TextView textView_footer;

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        LayoutInflater mInflater = LayoutInflater.from(FourActivity.this);
        switch (viewType) {
            case TYPE_CONTENT:
                ViewGroup vImage = (ViewGroup) mInflater.inflate(R.layout.item_content, parent, false);
                ViewContentHolder vhImage = new ViewContentHolder(vImage);
                return vhImage;
            case TYPE_HEAD:
                ViewGroup vGroup = (ViewGroup) mInflater.inflate(R.layout.item_header, parent, false);
                ViewHeadHolder vhGroup = new ViewHeadHolder(vGroup);
                return vhGroup;
            case TYPE_FOOTER:
                ViewGroup footer = (ViewGroup) mInflater.inflate(R.layout.item_footer, parent, false);
                ViewFooterHolder vhfooter = new ViewFooterHolder(footer);
                return vhfooter;
        }
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        int count = 0;
        for (int i = 0; i < list.size(); i++) {
            Bean bean = list.get(i);
            List<String> dataList = bean.getDataList();
            if (position == count) {
                ViewHeadHolder vGroup = (ViewHeadHolder) holder;
                vGroup.textView_head.setText(bean.getHeader());
            }
            count++;
            for (int j = 0; j < dataList.size(); j++) {
                if (position == count) {
                    ViewContentHolder vhImage = (ViewContentHolder) holder;
                    vhImage.textView_content.setText(dataList.get(j));
                }
                count++;
            }
            if (position == count) {
                ViewFooterHolder vhImage = (ViewFooterHolder) holder;
                vhImage.textView_footer.setText(bean.getFooter());
            }
            count++;
        }
    }

    @Override
    public int getItemViewType(int position) {
        int count = 0;
        for (int i = 0; i < list.size(); i++) {
            Bean bean = list.get(i);
            List<String> dataList = bean.getDataList();
            if (position == count) {

                return TYPE_HEAD;
            }
            count++;
            for (int j = 0; j < dataList.size(); j++) {
                if (position == count) {
                    return TYPE_CONTENT;
                }
                count++;
            }

            if (position == count) {
                return TYPE_FOOTER;
            }
            count++;

        }
        return 0;
    }

    @Override
    public int getItemCount() {
        int count = list.size() * 2;
        for (int i = 0; i < list.size(); i++) {
            Bean bean = list.get(i);
            List<String> dataList = bean.getDataList();
            count += dataList.size();
        }
        return count;
    }

    public class ViewHeadHolder extends RecyclerView.ViewHolder {
        public View rootView;
        public TextView textView_head;

        public ViewHeadHolder(View rootView) {
            super(rootView);
            this.rootView = rootView;
            this.textView_head = (TextView) rootView.findViewById(R.id.textView_head);
        }

    }

    public class ViewContentHolder extends RecyclerView.ViewHolder {
        public View rootView;
        public TextView textView_content;

        public ViewContentHolder(View rootView) {
            super(rootView);
            this.rootView = rootView;
            this.textView_content = (TextView) rootView.findViewById(R.id.textView_content);
        }

    }

    public class ViewFooterHolder extends RecyclerView.ViewHolder {
        public View rootView;
        public TextView textView_footer;

        public ViewFooterHolder(View rootView) {
            super(rootView);
            this.rootView = rootView;
            this.textView_footer = (TextView) rootView.findViewById(R.id.textView_footer);
        }

    }
}


平时我们不愿意用这个分组;但是遇到性能需要的时候还是用这种分组形式比较好,


demo 下载地址

http://download.csdn.net/detail/u012629497/9605391


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我会为您找到相关的demo。以下是一份简单的qt图片列表懒加载demo代码,仅供参考: ``` #include <QApplication> #include <QListView> #include <QStandardItemModel> #include <QtConcurrent> void loadImage(int index, QStandardItemModel* model) { QImage img; img.load("path_to_image_" + QString::number(index)); if (!img.isNull()) { QStandardItem* item = model->item(index); if (item) { item->setData(QVariant(QPixmap::fromImage(img)), Qt::DecorationRole); } } } int main(int argc, char *argv[]) { QApplication a(argc, argv); QListView listView; QStandardItemModel model; // 填充数据 for (int i = 0; i < 100; ++i) { QStandardItem* item = new QStandardItem(QString::number(i)); item->setIcon(QIcon(":/resources/loading_icon.png")); // 加载中的图标 model.appendRow(item); } listView.setModel(&model); // 列表滚动时触发 QObject::connect(&listView, &QListView::viewPortEntered, [&](){ // 异步加载图片 QtConcurrent::run([&](){ int firstVisible = listView.indexAt(QPoint(0, 0)).row(); int lastVisible = listView.indexAt(QPoint(0, listView.viewport()->height())).row(); int loadCount = 5; // 每次加载的数量 for (int i = firstVisible; i < lastVisible; ++i) { loadImage(i, &model); } }); }); listView.show(); return a.exec(); } ``` 通过这份demo代码,您可以学习和了解如何使用Qt实现图片列表懒加载。当用户滚动列表视图时,系统会异步加载可视范围内的图片,从而提升列表滚动的流畅度。希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值