在垂直列表视图中同步水平 RecyclerView
Sync al horizontal RecyclerView inside vertical list view
您好,我有垂直列表(自定义 ArrayAdapter),其中每个元素都有一个水平 RecyclerView,给我一个 table 格式。
我想要做的是,如果水平滚动一行,其余行也应该是。我尝试将它们放在水平滚动视图中并使用各种技巧,但没有成功。
如果可能的话,我也希望这种同步保持第一个元素固定。
创建 RecyclerView.OnScrollListener
的实例。此实例对于 所有 您的水平回收器视图都是通用的。当调用 onScrolled( )
时,滚动除调用此视图的视图之外的所有视图。
在 Little Child 的回答中添加更多内容,这比预期的要棘手,我不得不在我的主要 Activity 中创建一个由 onScroll 调用的自定义侦听器。这是因为onScroll是在一个getView方法中,没有获取到listview中的其他视图,但是我的mainactivty可以访问到。
在我的列表适配器中,我添加了
public interface RecycleListener {
public void onScroll(int scroll_x);
}
然后在getView
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
listener.onScroll(recyclerView.computeHorizontalScrollOffset());
}
});
最后在 MainActivity
dayAdapter.setRecycleListener(new DayAdapter.RecycleListener() {
int busy = 0;
@Override
public void onScroll(int scroll_x)
{
if(busy == 1) return;
busy = 1;
for(int i = 0;i<days.size();i++)
{
View view = lv.getChildAt(i);
if(view == null) continue;
RecyclerView r = (RecyclerView) view.findViewById(R.id.timetable_row_recycler);
LinearLayoutManager layoutManager = ( LinearLayoutManager) r.getLayoutManager();
layoutManager.scrollToPositionWithOffset(0,0-scroll_x);
}
busy = 0;
}
});
注意 我发现您可以使用 int scroll_x = recyclerView.computeHorizontalScrollOffset()
轻松获取滚动位置,但是没有直接的方法将其应用回来。 layoutManager.scrollToPosition(i)
方法滚动到第 i 个元素而不是滚动位置,所以唯一正确的可能方法是
layoutManager.scrollToPositionWithOffset(0,0-scroll_x);
或(在自定义布局管理器的情况下)
((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(0,0-scroll_x);
我们基本上对第 0 个位置应用负偏移,因此它不会滚动到第 0 个之前的偏移,而是滚动到我们想要的 scroll_x。
更新
这有效但造成了很多滞后,所以后来我最终切换到 android.widget.TableLayout,并插入行(android.widget.TableRow),就像我尝试使用 recyclerview 一样。
您好,我有垂直列表(自定义 ArrayAdapter),其中每个元素都有一个水平 RecyclerView,给我一个 table 格式。
我想要做的是,如果水平滚动一行,其余行也应该是。我尝试将它们放在水平滚动视图中并使用各种技巧,但没有成功。
如果可能的话,我也希望这种同步保持第一个元素固定。
创建 RecyclerView.OnScrollListener
的实例。此实例对于 所有 您的水平回收器视图都是通用的。当调用 onScrolled( )
时,滚动除调用此视图的视图之外的所有视图。
在 Little Child 的回答中添加更多内容,这比预期的要棘手,我不得不在我的主要 Activity 中创建一个由 onScroll 调用的自定义侦听器。这是因为onScroll是在一个getView方法中,没有获取到listview中的其他视图,但是我的mainactivty可以访问到。
在我的列表适配器中,我添加了
public interface RecycleListener {
public void onScroll(int scroll_x);
}
然后在getView
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
listener.onScroll(recyclerView.computeHorizontalScrollOffset());
}
});
最后在 MainActivity
dayAdapter.setRecycleListener(new DayAdapter.RecycleListener() {
int busy = 0;
@Override
public void onScroll(int scroll_x)
{
if(busy == 1) return;
busy = 1;
for(int i = 0;i<days.size();i++)
{
View view = lv.getChildAt(i);
if(view == null) continue;
RecyclerView r = (RecyclerView) view.findViewById(R.id.timetable_row_recycler);
LinearLayoutManager layoutManager = ( LinearLayoutManager) r.getLayoutManager();
layoutManager.scrollToPositionWithOffset(0,0-scroll_x);
}
busy = 0;
}
});
注意 我发现您可以使用 int scroll_x = recyclerView.computeHorizontalScrollOffset()
轻松获取滚动位置,但是没有直接的方法将其应用回来。 layoutManager.scrollToPosition(i)
方法滚动到第 i 个元素而不是滚动位置,所以唯一正确的可能方法是
layoutManager.scrollToPositionWithOffset(0,0-scroll_x);
或(在自定义布局管理器的情况下)
((LinearLayoutManager) layoutManager).scrollToPositionWithOffset(0,0-scroll_x);
我们基本上对第 0 个位置应用负偏移,因此它不会滚动到第 0 个之前的偏移,而是滚动到我们想要的 scroll_x。
更新
这有效但造成了很多滞后,所以后来我最终切换到 android.widget.TableLayout,并插入行(android.widget.TableRow),就像我尝试使用 recyclerview 一样。