1

我创建了一个RecyclerView这样的嵌套(它是垂直的RecyclerView,它的子视图TextView用于部分标题,水平RecyclerView用于项目列表)。

有些项目可以同时处于 2 个(或更多)水平RecyclerView,我想保持主题同步(所以如果其中一个项目发生变化,其他项目也会知道)。

我怎样才能做到这一点?

在此处输入图像描述

4

4 回答 4

1

它更像是与数据结构相关的问题,而不是RecyclerView. 我建议将HashMap您要填充的项目保留在水平列表中。

因此,当更改列表项(例如,将项目标记为收藏)时,只需将值HashMap从 true 更改为 false,反之亦然。

然后调用notifyDatasetChanged()您的适配器以反映水平列表中的更改。

希望有帮助。

于 2016-05-25T15:01:12.920 回答
0

我没有测试过这段代码,它是一种伪代码,也不确定它是否是一个好的解决方案,但想尝试为您指明正确的方向。也许你会发现一些有用的东西。忽略不好的命名..

创建一个所有嵌套回收器视图都实现的接口,该接口执行实际滚动。

public interface ScrollListener {
        void update(int scrollOffset);
}

在嵌套的回收器视图中实现

public class NestedRecyclerViewFragment implements NestedScrollListener {

        RecyclerView mRecyclerView;

        @Override
        public onCreate(Bundle savedInstance) {
            mRecyclerView.addOnScrollListener { 
                public onScroll(int xOffset, int yOffset) {
                   if (getActivity() instanceof OnNestedRecyclerViewScrollListener) {
                        ((OnNestedRecyclerViewScrollListener) getActivity()).onNestedScroll(xOffset);
                    }
                }
            }
        }
        ....

        @Override
        protected void update(int scrollOffset) {
            mRecyclerView.scrollTo(scrollOffset, 0);
        }

        ....
}

然后你可能有这个父级实现的其他接口。

public interface OnNestedRecyclerViewScrollListener {
        void onNestedScroll(int scrollOffset);
}

其中具有嵌套的回收器视图。

public class ParentFragment implements OnNestedRecyclerViewScrollListener {

           Adapter nestedRecyclerViewAdapter;

            ....

            @Override
            protected void onNestedScroll(int scrollOffset) {
                for (int i = 0; i < nestedRecyclerViewAdapter.getItemCount(); i++) {
                    RecyclerView recyclerView = nestedRecyclerViewAdapter.getItemAt(i);
                    if (recyclerView instanceof NestedScrollListener) {
                        ((NestedScrollListener) recyclerView).update(scrollOffset);
                    }
                }
            }

            ....
    }

注意:一直迭代适配器中的项目可能不好,但它可能会为您指明正确的方向

于 2016-05-25T15:44:08.053 回答
0

如果不想统一 RecyclerViews 数据模型,可以使用 LocalBroadcastReceiver。每个 RecyclerView 都应该将自己设置为观察者,并且在需要时,您可以通知一个 RecyclerView 中的任何更改,并在其他 RecyclerViews 中执行您想要的操作。

于 2016-05-25T15:59:26.070 回答
0

我假设您从网络或某个数据库中获取 a Listof Lists,并且不同水平列表上的相同项目将具有一些通用标识符,例如idor primary key

在用户交互中,您需要做的就是遍历所有水平列表中的所有项目,并检查它是否是同一个项目,其值已被修改,并在该点更新值。因此,它就像notifyDatasetChanged()在您更改数据的每个水平列表上调用 a 一样简单。

于 2016-05-25T14:57:44.017 回答