【问题标题】:How to make recyclerview Expandable without using third party libraries如何在不使用第三方库的情况下使 recyclerview 可扩展
【发布时间】:2017-06-27 07:58:42
【问题描述】:

我想使用 RecyclerView 创建一个项目列表,并希望在单击时展开特定项目(如在电话列表中)。我想在不使用任何库的情况下实现这一目标。有人可以帮忙吗?

【问题讨论】:

  • 没有我们的库你不能这样做,因为 android 确实提供了可扩展的回收器视图。这里是可扩展回收器视图的好教程bignerdranch.com/blog/expand-a-recyclerview-in-four-steps
  • @AbhishekSingh 你可以在没有外部库的情况下做到这一点。看我的回答
  • @MilindMevada 谢谢我会试试的。

标签: java android


【解决方案1】:

获取子数据列表作为数据集中父数据的成员。 并且,在 RecyclerView 行的点击事件中,像这样使用它们.. 这里 mdataSet 是 RecyclerView 的主要数据集

final TitleHolder holder = (TitleHolder) h;
        final Model model = (Model) mdataSet.get(position);

        holder.txt_title.setText(model.getTitle());
        holder.childItem = model;

        holder.txt_title.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (model.getChildList() == null) {
                    //collapse
                    ((Model) mdataSet.get(mdataSet.indexOf(holder.childItem))).isExpanded = false;
                    holder.arrow.startAnimation(AnimationUtils.loadAnimation(context, R.anim.arrow_reverse));
                    model.childList = new ArrayList<ModelData>();
                    int count = 0;
                    int pos = mdataSet.indexOf(holder.childItem);
                    while (mdataSet.size() > pos + 1 && mdataSet.get(pos + 1).type == Model.VIEW_CHILD) {
                        model.childList.add((ModelData) mdataSet.remove(pos + 1));
                        count++;
                    }
                    notifyItemRangeRemoved(pos + 1, count);
                } else {
                    //expand
                    ((Model) mdataSet.get(mdataSet.indexOf(holder.childItem))).isExpanded = true;
                    holder.arrow.startAnimation(AnimationUtils.loadAnimation(context, R.anim.arrow));
                    int pos = mdataSet.indexOf(holder.childItem);
                    int index = pos + 1;
                    for (ModelData i : model.getChildList()) {
                        mdataSet.add(index, i);
                        index++;
                    }
                    notifyItemRangeInserted(pos + 1, index - pos - 1);
                    model.childList = null;

                }

            }
        });

        if (((Model) mdataSet.get(mdataSet.indexOf(holder.childItem))).isExpanded) {
            holder.arrow.startAnimation(AnimationUtils.loadAnimation(context, R.anim.arrow));
        }

在这里,我将在txt_title 的点击事件中将子数据添加到主数据集 同样,使用Title(parent)data(child) 作为两个不同的视图类型,像这样

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

        if (viewType == VIEW_TITLE) {
            View itemView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_expand_title, parent, false);
            return new TitleHolder(itemView);
        } else {
            View itemView = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.row_wallet_history, parent, false);
            return new DataHolder(itemView);
        }
    }

如果您的子视图是固定的(您想要展开/折叠),则将它们包裹在布局中,并使该布局可见/消失,以实现展开折叠效果 参考this link 让它们动画化

【讨论】:

  • 是的。这是实现这一目标的另一种方法。感谢@AbhishekSingh 合并我的答案。我删除了我的其他帖子
  • 这将有助于其他搜索相同问题的人
猜你喜欢
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2019-09-11
  • 1970-01-01
相关资源
最近更新 更多