【发布时间】:2015-12-23 18:21:10
【问题描述】:
嗨,我有一个垂直列表(自定义 ArrayAdapter),其中每个元素都有一个水平 RecyclerView,给我一个类似格式的表格。
我想要做的是,如果一行水平滚动,其余行也应该是。我尝试将它们放在水平滚动视图和各种可用技巧中,但没有成功。
【问题讨论】:
标签: android android-listview android-recyclerview android-scrollview
嗨,我有一个垂直列表(自定义 ArrayAdapter),其中每个元素都有一个水平 RecyclerView,给我一个类似格式的表格。
我想要做的是,如果一行水平滚动,其余行也应该是。我尝试将它们放在水平滚动视图和各种可用技巧中,但没有成功。
【问题讨论】:
标签: android android-listview android-recyclerview android-scrollview
创建RecyclerView.OnScrollListener 的实例。此实例对于所有您的水平回收站视图都是通用的。当onScrolled( ) 被调用时,滚动除调用它的视图之外的所有视图。
【讨论】:
RecyclerViews 存储在某个地方。就像在一组或列表中一样。
在 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 一样。
【讨论】: