问题描述
我有两个要一起滚动的 ListView
对象.它们是并排的,因此,如果一个滚动一定数量,则另一个滚动相同数量.我已经找到了一些有关如何执行此操作的示例,但我相信它们依赖于 ListView
中相同高度的项目(如果我错了,请纠正我).我的 ListView
对象之一的项目比另一个对象高,跨越2-3个项目.
I've got two ListView
objects that I would like to scroll together. They are side-by-side, so if one scrolls a certain amount, the other scrolls that same amount. I've found some examples on how to do this, but I believe that they rely on the items in the ListView
being the same height (correct me if I am wrong). The items in one of my ListView
objects are taller than the ones in the other, spanning 2-3 items.
如何将这两个 ListView
对象锁定"在一起?
How do I "lock" these 2 ListView
objects together?
这是我所拥有的屏幕截图,也许它可以更好地解释我要做什么.左侧(红色)是项目列表,右侧是单独的列表.您会看到列表如何无法完美对齐,因此它并非完全是网格.我想做的就是将此行为像一个大列表一样,在其中一个列表中滚动也会在另一个列表中滚动.
Here's a screenshot of what I have, maybe it will better explain what I'm going for. The left side (red) is a list of items and the right side is a separate list. You can see how the lists don't align perfectly, so it isn't exactly a grid. What I would like to do is have this act like one big list, where scrolling either list will also scroll the other.
推荐答案
我创建了一个粗糙的类,基本上可以完成我想做的事情.如果第二个列表比第一个列表长,或者方向发生变化,这还不够聪明,但是足以使这个概念下降.
I created a rough class that does basically what I wanted to do. It's not smart enough to handle if the 2nd list is longer than the 1st or if the orientation changes, but it's good enough to get the concept down.
要设置它:
list1.setOnScrollListener(new SyncedScrollListener(list2));
list2.setOnScrollListener(new SyncedScrollListener(list1));
SyncedScrollListener.java
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
}
}
这篇关于一起滚动ListView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!