我有两个ListView要滚动在一起的对象。它们 并排放置,因此,如果一个滚动一定数量,则另一个滚动相同 数量。我已经找到了一些有关如何执行此操作的示例,但我相信它们 依赖于ListView高度相同的项目(如果我 错了,请纠正我)。我的一个ListView对象中的项目比另一个对象中的项目高 ,跨越2-3个项目。
如何将这两个ListView对象“锁定”在一起?
ListView
编辑:这是我所拥有的屏幕截图,也许它将更好地解释 我要做什么。左侧(红色)是项目列表,右侧是 单独的列表。您会看到列表如何无法完美对齐,因此它并非 完全是网格。我想做的就是将此行为像一个大列表一样, 在其中一个列表上滚动也会在另一个列表上滚动。
我创建了一个粗糙的类,基本上可以完成我想做的事情。它不是 足够聪明来处理,如果第二个名单是比第一或者更长的 方向变化,但它的好足以让这个概念了。
进行设置:
list1.setOnScrollListener(new SyncedScrollListener(list2)); list2.setOnScrollListener(new SyncedScrollListener(list1));
package com.xorbix.util; import android.view.View; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; public class SyncedScrollListener implements OnScrollListener{ int offset; int oldVisibleItem = -1; int currentHeight; int prevHeight; private View mSyncedView; public SyncedScrollListener(View syncedView){ if(syncedView == null){ throw new IllegalArgumentException("syncedView is null"); } mSyncedView = syncedView; } public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { int[] location = new int[2]; if(visibleItemCount == 0){ return; } if(oldVisibleItem != firstVisibleItem){ if(oldVisibleItem < firstVisibleItem){ prevHeight = currentHeight; currentHeight = view.getChildAt(0).getHeight(); offset += prevHeight; }else{ currentHeight = view.getChildAt(0).getHeight(); View prevView; if((prevView = view.getChildAt(firstVisibleItem - 1)) != null){ prevHeight = prevView.getHeight(); }else{ prevHeight = 0; } offset -= currentHeight; } oldVisibleItem = firstVisibleItem; } view.getLocationOnScreen(location); int listContainerPosition = location[1]; view.getChildAt(0).getLocationOnScreen(location); int currentLocation = location[1]; int blah = listContainerPosition - currentLocation + offset; mSyncedView.scrollTo(0, blah); } public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub } }