4

リストビューを実装しました。すべてのユーザーが下の画面にスクロールし、リストビューに新しいデータを自動的に追加します。スクロールが完了すると、表示ビューに入るすべての新しいアイテムに対して、最初から最後までonScroll()が呼び出されます。スクロール。

lv_best = (ListView) findViewById(R.id.lv_best);
bestadapter = new LazyAdapter(this, lst_tab_best);
lv_best.setAdapter(bestadapter);
lv_best.setOnScrollListener(new AbsListView.OnScrollListener() {

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) { }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
                        int visibleItemCount, int totalItemCount) {

    Log.d("onScroll ", firstVisibleItem+"-"+visibleItemCount+"-"+totalItemCount);
    boolean loadMore = firstVisibleItem + visibleItemCount >= totalItemCount;
    if(loadMore){
            new ChangeTab_best().execute();
     }
     }
    });

エミュレーターで実行し、5つの項目を含む上記のリストを表示しましたが、ListViewでスクロールの終了を検出できず、ChangeTab_best()が何度も呼び出されます。Logcatandroidを見ると、すべての変数firstVisibleItem、visibleItemCount、totalItemCountは常に0になります。

では、ここで何が起こっているのでしょうか。

4

3 に答える 3

15

画面の下部にあるアイテムを検出するには、 と を使用する必要がfirstVisibleItemありvisibleItemCountます。demo exampleバックグラウンドでアイテムをロードしてUIを更新するAsyncTaskを使用して、同じものを作成しました。

Total of firstVisibleItemandvisibleItemCountは、ロードされたアイテムの数を提供し、さらにアイテムをロードするロジックを実装できます。

int loadedItems = firstVisibleItem + visibleItemCount;
于 2012-12-07T16:11:44.300 に答える
0
    lv_best.setOnScrollListener(new OnScrollListener() {
                @Override
                public void onScrollStateChanged(AbsListView view, int scrollState) {
                    switch (scrollState) {
                    case OnScrollListener.SCROLL_STATE_IDLE:
                                         // when list scrolling stops

                                        manipulateWithVisibleViews(view);

                        break;
                    case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
                        break;
                    case OnScrollListener.SCROLL_STATE_FLING:
                        break;
                    }
                }

                @Override
                public void onScroll(AbsListView view, int firstVisibleItem,
                        int visibleItemCount, int totalItemCount) { 
                }
            });

private void manipulateWithVisibleViews(AbsListView view){
        int count = view.getChildCount(); // visible views count
        int lastVisibleItemPosition = view.getLastVisiblePosition();

        for (int i = 0; i < count; i++) {
            View convertView = view.getChildAt(i);
            // update views
            }
        }

}
于 2012-12-07T11:10:54.713 に答える