検索

ホームページ  >  に質問  >  本文

Android-如何判断ListView滚动是由手指滑动触发的还是代码触发的

我当前有个需求是做类似于饿了么外卖App的选择商品页面的两个ListView联动的效果:

1.左边的分类ListView点击后,右边的商品ListView能滚动到指定的分类板块。
2.滑动右边的商品ListView,左边的分类ListView能切换选中标记。

我的做法是:

private boolean mIsClickTrigger;
....
mCategoryListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        int productPos = ...;
        isClickTrigger = true;
        mProductListView.setSelection(productPos);
    }
});
mProductListView.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {}

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        if (isClickTrigger) {
            // 消耗掉点击触发
            isClickTrigger = false;
        } else {
            int categoryPos = ...;
            mCategoryListView.setItemChecked(categoryPos, true);
        }
    }
});

isClickTrigger这个标志位的作用是:当点击左边的分类ListView的某一项时,使滚动监听里的代码不执行。只有当用手指滑动右边的商品ListView时,才执行滚动监听里的代码。

但这样有个问题,当我使用listview.setSection(10)后发现滚动很突兀,为了让它能平滑地滚动,我用了listview.smoothScrollToPosition(10),滚动是很平滑了,但是由于滚动监听被多次回调了,标志位就没效果了。

所以想请问大家有没有什么好的办法,先谢谢了!!!

巴扎黑巴扎黑2768日前328

全員に返信(4)返信します

  • 伊谢尔伦

    伊谢尔伦2017-04-17 15:02:26

    そこで解決したいのは:
    mProductListViewのスライドが終了すると、フラグに基づいてユーザーが手動でスライドしたと判断し、mCategoryListViewの対応するエントリのチェックステータスを変更する。
    mCategoryListView.onItemClick() によって mProductListView がスライドする場合、これを行う必要はありません。

    スクロール処理中は

    onScroll(...) が呼び出され続けるため、フラグを処理できません。 やるべきことは「ListViewのスクロールが終了したことをどうやって判断するか」です。 』
    onScrollStateChanged(...) パラメータ scrollState には 3 つの状態があります。そのうちの 1 つは SCROLL_STATE_IDLE で、「スクロール終了」状態を示すために使用できます。したがって、フラグは onScrollStateChanged() ではなく onScroll で判断される必要があります:

    リーリー

    しかし、十数回テストした結果、以下のログに示すように、半分のテストで SCROLL_STATE_IDLE が 1 回発生し、残りの半分のテストで 2 回発生するという問題が見つかりました。 リーリー

    まずこれがどのように機能するかを確認する必要があります。機能しない場合は、「ListView のスクロールの終了」を判断するための回避策を見つける必要があります。 。 。

    返事
    0
  • ringa_lee

    ringa_lee2017-04-17 15:02:26

    アダプターに View.OnTouchListener の監視を実装し、onTouch() メソッドを実装します。
    @Override

    リーリー

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 15:02:26

    質問者はなぜそのような必要があるのでしょうか?アンチマシンスクリプトですか?

    返事
    0
  • 迷茫

    迷茫2017-04-17 15:02:26

    これを考慮すると、その問題についてまだ考えていないことになります。

    返事
    0
  • キャンセル返事