我创建了一个RecyclerView
这样的嵌套(它是垂直的RecyclerView
,它的子视图TextView
用于部分标题,水平RecyclerView
用于项目列表)。
有些项目可以同时处于 2 个(或更多)水平RecyclerView
,我想保持主题同步(所以如果其中一个项目发生变化,其他项目也会知道)。
我怎样才能做到这一点?
我创建了一个RecyclerView
这样的嵌套(它是垂直的RecyclerView
,它的子视图TextView
用于部分标题,水平RecyclerView
用于项目列表)。
有些项目可以同时处于 2 个(或更多)水平RecyclerView
,我想保持主题同步(所以如果其中一个项目发生变化,其他项目也会知道)。
我怎样才能做到这一点?
它更像是与数据结构相关的问题,而不是RecyclerView
. 我建议将HashMap
您要填充的项目保留在水平列表中。
因此,当更改列表项(例如,将项目标记为收藏)时,只需将值HashMap
从 true 更改为 false,反之亦然。
然后调用notifyDatasetChanged()
您的适配器以反映水平列表中的更改。
希望有帮助。
我没有测试过这段代码,它是一种伪代码,也不确定它是否是一个好的解决方案,但想尝试为您指明正确的方向。也许你会发现一些有用的东西。忽略不好的命名..
创建一个所有嵌套回收器视图都实现的接口,该接口执行实际滚动。
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);
}
}
}
....
}
注意:一直迭代适配器中的项目可能不好,但它可能会为您指明正确的方向
如果不想统一 RecyclerViews 数据模型,可以使用 LocalBroadcastReceiver。每个 RecyclerView 都应该将自己设置为观察者,并且在需要时,您可以通知一个 RecyclerView 中的任何更改,并在其他 RecyclerViews 中执行您想要的操作。
我假设您从网络或某个数据库中获取 a List
of List
s,并且不同水平列表上的相同项目将具有一些通用标识符,例如id
or primary key
。
在用户交互中,您需要做的就是遍历所有水平列表中的所有项目,并检查它是否是同一个项目,其值已被修改,并在该点更新值。因此,它就像notifyDatasetChanged()
在您更改数据的每个水平列表上调用 a 一样简单。