【问题标题】:How to syncronisize two Listview positions如何同步两个 Listview 位置
【发布时间】:2012-08-08 00:39:09
【问题描述】:

我有两个ListViews。当我滚动任何一个列表时,有什么方法可以同步ListViews 的位置。我正在实现一个AbsListView.OnScrollListener,注册到ListView。当滚动ListView 时,会触发OnScrollListeneronScroll() 方法,然后调用'smoothScrollToPosition()'。但它不能正常工作。有人可以为此提供任何代码示例吗?

【问题讨论】:

  • 为什么有两个列表?为什么不将所有数据放在一个列表中?
  • 因为我试图创建我自己的复合控件,它必须用 2 个 listView 和其他组件来实现。
  • 我想我只是不明白目的,如果列表总是一起滚动,它属于一起,可以进入一个包含多行或多列的列表(IMO)。或者这是你设置相对位置的东西。然后锁定滚动?
  • 好吧,也许我解释错了,另一个列表视图可以垂直和水平滚动,但是当我想垂直滚动它时,它也必须与其他列表视图一起移动,然后当你水平滚动它,您只能水平滚动该列表视图,而另一个保持固定。
  • Listview 只能垂直滚动,要水平滚动可以使用 ScrollView。

标签: java android listview xamarin.android


【解决方案1】:

这是 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());
            }
        }
    });
}
}

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>

【讨论】:

  • 如果物品的尺寸不同,这将不起作用,是吗?
  • 不...它确实有效,但您可能不会获得您想要的效果。但它有点过时了。如果我是你,我会查看 RecyclerView。这是一个很好的解释它是如何工作的wiresareobsolete.com/2014/09/…
【解决方案2】:

如果位置可见,smoothScrollToPosition() 将不会滚动。您可以考虑在其他当前未滚动的列表上使用 scrollTo 或 scrollBy,但请注意不要输入递归,每个列表都调用另一个列表进行滚动。

【讨论】:

  • 但在这种情况下,如果我使用 scrollTo 或 scrollBy,只会移动渲染的项目,但它不能作为适配器工作。
  • 不,它不在适配器上,滚动在视图上,所以你可以有一个只显示部分项目的滚动。您也可以尝试 public void smoothScrollToPositionFromTop (int position, int offset) 强制将项目滚动到顶部,但是要使两个列表同步,您需要在两个列表上调用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
相关资源
最近更新 更多