如何在Android中实现垂直RecyclerView内部的垂直RecyclerView?

5
假设我在一个RecyclerView中有2个项目,每个项目都有一个包含大约100个项目innerrecyclerview,它们都是垂直的或者其他任何不会对现有问题产生影响的方向。
我已经在其他stackoverflow问题或其他android博客上实现了这里提供的方法,但都没有帮助。
我有一个关于onbindviewholder的问题,项目1内部的RecyclerViewonbindviewholder会一次性地为所有元素即100个调用,而且它们没有进行任何回收或其他操作,因为onbindviewholder没有随着滚动而被调用,这对于正常行为的RecyclerView应该起作用。
如何使innerrecyclerview也可以回收,因为所有其他文章都没有谈论这个问题。 CourseRVAdapter或ParentAdapter
public class CourseRVAdapter extends RecyclerView.Adapter<CourseRVAdapter.SimpleViewHolder> {

        private Context mContext;
        private List<data> merchantlist;
        private List<data> merchantlist2;
        private RecyclerView horizontalList;
        Typeface MRR;
        private Typeface MR;


        public class SimpleViewHolder extends RecyclerView.ViewHolder {
            public final TextView title;
            private HorizontalRVAdapter horizontalAdapter;

            public SimpleViewHolder(View view) {
                super(view);
                Context context = itemView.getContext();
                title = (TextView) view.findViewById(R.id.text_1);
                horizontalList = (RecyclerView) itemView.findViewById(R.id.my_recycler_view);
                horizontalList.setLayoutManager(new CustomLinearLayoutManager(mContext, 3));
                horizontalAdapter = new HorizontalRVAdapter(merchantlist, mContext, MR);
                horizontalList.setAdapter(horizontalAdapter);
            }
        }



        CourseRVAdapter(List<data> merchantlist2, Context mContext, Typeface MRR, List<data> merchantlist, Typeface MR) {

            this.merchantlist2 = merchantlist2;
            this.merchantlist = merchantlist;
            this.mContext = mContext;
            this.MRR = MRR;
            this.MR = MR;

        }
        public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            final View view = LayoutInflater.from(mContext).inflate(R.layout.merchant_list_header, parent, false);
            return new SimpleViewHolder(view);
        }

        @Override
        public void onBindViewHolder(SimpleViewHolder holder, final int position) {



        }

        @Override
        public int getItemCount() {

            return merchantlist2.size();
        }

    }

HorizontalRVAdapter or Inneradapter

public class HorizontalRVAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

            List<data> merchantlist;
            FragmentActivity main;
            Context mContext;
            Typeface MRR;

            public HorizontalRVAdapter(List<data> merchantlist, Context mContext, Typeface MRR) {

                this.merchantlist = merchantlist;
                this.mContext = mContext;
                this.MRR = MRR;

            }

            private class ItemViewHolder extends RecyclerView.ViewHolder {

                private TextView merchantname;

                public ItemViewHolder(View itemView) {
                    super(itemView);
                    merchantname = (TextView) itemView.findViewById(R.id.merchant_name);
                }
            }

            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                Context context = parent.getContext();
                View itemView = LayoutInflater.from(context).inflate(R.layout.merchant_list_item, parent, false);
                ItemViewHolder holder = new ItemViewHolder(itemView);
                return holder;
            }

            @Override
            public void onBindViewHolder(RecyclerView.ViewHolder rawHolder, int position) {

                ItemViewHolder holder = (ItemViewHolder) rawHolder;
                data list = merchantlist.get(position);
                holder.merchantname.setText(list.merchantname);
                holder.itemView.setTag(position);

                Log.d("TAG", "onbindviewholder -- > " + position);
            }

            @Override
            public int getItemCount() {
                return merchantlist.size();
            }

        }

我还没有解释如何为recyclerview填充数据。

例如:parentrecyclerview有1或2个项目,而innerrecyclerview有100个项目。

编辑:

因此,在得到第一个评论后,我更新了要实现的内容以获得更好的响应。

我有两个文本视图和一个网格recyclerview,我希望在滚动网格recyclerview时这两个文本视图也跟随滚动。我通过为这两个文本视图定义头部以及网格项的简单项持有者来实现这一点。

然后,我必须设置带跨度的Gridlayoutmanager,但它还包括前两个文本,我最终在该网格中也放置了这两个文本视图,这是不需要的。 The blue one is the one item of the oarentrecyclerview and the icon and text are the item for insiderecyclerview i want them to scroll in cohesion


1
为什么需要嵌套RecyclerView?这是不好的做法。也许你需要的是不同的东西。如果你能说明你需要什么,这里的人们可能会指引你正确的方向。 - Abbas
@Abbas 这并不是一个坏的做法,Google Play Android 应用在他们的主屏幕上就是这样做的,使用了垂直滚动视图中的水平滚动视图。我已经编辑了我的问题。 - Aman Verma
首先,我们无法确定他们是否在垂直RecyclerView中有多个水平RecyclerView。这也可能只是一个普通的ScrollView。其次,这样做是不好的,因为嵌套的RecyclerView可能会导致内存泄漏。如果有一张图片来说明这个变化会更好。 - Abbas
请查看图片,我们可以检查Playstore代码以确定他们是否使用了rcylerview或scrollview,我认为他们使用了,因为Google一直鼓励使用recyclerview,如果从内存和性能方面来说,scrollview已经过时了。 - Aman Verma
它运行得非常出色... 你应该将其写为答案,我会接受这个答案。 - Aman Verma
显示剩余2条评论
1个回答

1
所以问题出在一个垂直的RecyclerView内部有另一个垂直的RecyclerView。OP的问题是,当滚动嵌套的RecyclerView的项目时,onBindView()没有被调用。原因很简单:嵌套的RecyclerView从其父RecyclerView中获得了无限可用空间,因此绘制了所有视图。
问题已通过使用带有跨度查找的GridLayoutManager进行解决(有关详细信息,请参见此SO answer),从而不再需要使用嵌套的RecyclerView。

你尝试过创建一个高度固定的内部RecyclerView吗?在这种情况下,它是否仍然会创建所有单元格,还是会回收单元格? - Usman Rana
@UsmanRana 如果您设置了嵌套的RecyclerView的高度或宽度(取决于父级的方向),您确实可以创建嵌套的RecyclerView,但是正如评论中所述,不应该这样做,因为这可能会导致泄漏。如果您这样做,您只能在定义的嵌套RecyclerView边界内滚动。父级RecyclerView将完全无用,因为它根本不会滚动。 - Abbas
所有情况都可以通过使用不同的“LayoutManager”来更好地解决。如果没有可用于满足您需求的布局管理器,则应该实现一个适合您的布局管理器。 - Abbas
是的,但如果使用固定高度,即使在垂直RecyclerView内部也可以回收项目,那么它可能会有一点用处。 - Usman Rana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接