Java 如何同步两个Listview位置
我有两个Java 如何同步两个Listview位置,java,android,listview,xamarin.android,Java,Android,Listview,Xamarin.android,我有两个列表视图。当我滚动任何一个列表时,是否有任何方法可以同步列表视图的位置。我正在实现一个AbsListView.OnScrollListener,注册到ListView。滚动ListView时,将触发OnScrollListener的onScroll()方法,然后我调用“smoothScrollToPosition()”。但它不能正常工作。有人能为我提供一些代码示例吗?如果位置可见,smoothScrollToPosition()将不会滚动。您可以在当前未滚动的另一个列表上使用scroll
列表视图
。当我滚动任何一个列表时,是否有任何方法可以同步列表视图的位置。我正在实现一个AbsListView.OnScrollListener
,注册到ListView
。滚动ListView
时,将触发OnScrollListener
的onScroll()
方法,然后我调用“smoothScrollToPosition()”。但它不能正常工作。有人能为我提供一些代码示例吗?如果位置可见,smoothScrollToPosition()将不会滚动。您可以在当前未滚动的另一个列表上使用scrollTo或scrollBy,但注意不要在每个列表调用另一个列表滚动时输入递归。以下是nininho建议的工作代码示例
主要活动
public class MainActivity extends Activity {
public static String[] Cheeses = new String[] { "Abbaye de Belloc", "Abbaye du Mont des Cats",
"Abertam", "Abondance", "Ackawi", "Acorn", "Adelost", "Affidelice au Chablis",
"Afuega'l Pitu", "Airag", "Airedale", "Aisy Cendre", "Allgauer Emmentaler", "Alverca",
"Ambert", "American Cheese", };
ListView list1;
ListView list2;
boolean isLeftListEnabled = true;
boolean isRightListEnabled = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
Cheeses);
list1 = (ListView) findViewById(R.id.list1);
list1.setAdapter(adapter);
list2 = (ListView) findViewById(R.id.list2);
list2.setAdapter(adapter);
// IF YOU DO NOT OVERRIDE THIS
// ONLY THE ONE THAT IS TOUCHED WILL SCROLL OVER
list1.setOverScrollMode(ListView.OVER_SCROLL_NEVER);
list2.setOverScrollMode(ListView.OVER_SCROLL_NEVER);
list1.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// onScroll will be called and there will be an infinite loop.
// That's why i set a boolean value
if (scrollState == SCROLL_STATE_TOUCH_SCROLL) {
isRightListEnabled = false;
} else if (scrollState == SCROLL_STATE_IDLE) {
isRightListEnabled = true;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
View c = view.getChildAt(0);
if (c != null && isLeftListEnabled) {
list2.setSelectionFromTop(firstVisibleItem, c.getTop());
}
}
});
list2.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == SCROLL_STATE_TOUCH_SCROLL) {
isLeftListEnabled = false;
} else if (scrollState == SCROLL_STATE_IDLE) {
isLeftListEnabled = true;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
View c = view.getChildAt(0);
if (c != null && isRightListEnabled) {
list1.setSelectionFromTop(firstVisibleItem, c.getTop());
}
}
});
}
}
公共类MainActivity扩展活动{
公共静态字符串[]Cheeses=新字符串[]{“Abbaye de Belloc”,“Abbaye du Mont des Cats”,
“Abertam”、“Abondance”、“Ackawi”、“Acorn”、“Adelost”、“Affidelice au Chablis”,
“阿富加皮图”、“艾拉格”、“艾雷代尔”、“艾西·森德”、“阿尔高尔·埃门塔勒”、“阿尔韦卡”,
“Ambert”、“美国奶酪”};
列表视图列表1;
列表视图列表2;
布尔值isLeftListEnabled=true;
布尔值isRightListEnabled=true;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListAdapter=new ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,
奶酪);
list1=(ListView)findViewById(R.id.list1);
列表1.设置适配器(适配器);
list2=(ListView)findViewById(R.id.list2);
列表2.设置适配器(适配器);
//如果您不重写此
//只有被触摸的一个才会滚动
list1.setOverScrollMode(ListView.OVER\u SCROLL\u NEVER);
list2.setOverScrollMode(ListView.OVER\u SCROLL\u NEVER);
list1.setOnScrollListener(新的OnScrollListener(){
@凌驾
公共无效onScrollStateChanged(AbsListView视图,int scrollState){
//将调用onScroll,并且将有一个无限循环。
//这就是我设置布尔值的原因
如果(scrollState==滚动\状态\触摸\滚动){
isRightListEnabled=false;
}else if(scrollState==SCROLL\u STATE\u IDLE){
isRightListEnabled=true;
}
}
@凌驾
public void onScroll(AbsListView视图、int firstVisibleItem、int visibleItemCount、,
整数totalItemCount){
视图c=View.getChildAt(0);
如果(c!=null&&isLeftListEnabled){
列表2.setSelectionFromTop(firstVisibleItem,c.getTop());
}
}
});
list2.setOnScrollListener(新的OnScrollListener(){
@凌驾
公共无效onScrollStateChanged(AbsListView视图,int scrollState){
如果(scrollState==滚动\状态\触摸\滚动){
isLeftListEnabled=false;
}else if(scrollState==SCROLL\u STATE\u IDLE){
isLeftListEnabled=true;
}
}
@凌驾
public void onScroll(AbsListView视图、int firstVisibleItem、int visibleItemCount、,
整数totalItemCount){
视图c=View.getChildAt(0);
如果(c!=null&&isRightListEnabled){
列表1.setSelectionFromTop(firstVisibleItem,c.getTop());
}
}
});
}
}
XML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:splitMotionEvents="true">
<ListView android:id="@+id/list1"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1" />
<ListView android:id="@+id/list2"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
为什么要列出两个列表?为什么不把所有的数据放在一个列表中呢?因为我正在尝试创建我自己的复合控件,它必须用2个listView和其他组件来实现。我想我只是不明白它的目的,如果列表总是滚动在一起,它就属于一起,可以放在一个包含多行或多列的列表中(IMO)。或者这是你设置相对位置然后锁定滚动的地方吗?好吧,也许我解释错了,另一个listview可以垂直和水平滚动,但是当我想垂直滚动时,它也必须与其他listview一起移动,然后,当你水平滚动时,你只能水平滚动列表视图,而另一个保持不变。列表视图只垂直滚动,要水平滚动,你可以使用滚动视图。但在这种情况下,如果我使用滚动到或滚动到,只会移动呈现的项目,但它不能作为适配器工作。不,它不在适配器上,滚动条位于视图上,因此您可以有一个仅显示部分项目的滚动条。您也可以尝试public void smoothScrollToPositionFromTop(int position,int offset)强制将项目滚动到顶部,但要使两个列表同步,您需要在两个列表上调用此选项。如果项目的大小不同,这将不起作用,是吗?否。。。它确实有效,但你可能不会有你想要的效果。但它有点过时了。如果我是你,我会去看看回收站。这里有一个很好的解释它是如何工作的