Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何同步两个Listview位置_Java_Android_Listview_Xamarin.android - Fatal编程技术网

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)强制将项目滚动到顶部,但要使两个列表同步,您需要在两个列表上调用此选项。如果项目的大小不同,这将不起作用,是吗?否。。。它确实有效,但你可能不会有你想要的效果。但它有点过时了。如果我是你,我会去看看回收站。这里有一个很好的解释它是如何工作的