1

したがって、ListView と上下のボタンがあります。

私の目標は、ボタンの1つを押すたびにListViewを高さだけスクロールすることです。単純な上下のナビゲーションです。

スクロールは機能します。押し下げると、スクロールするたびに ListView が正しい距離だけスクロールします。

ただし、上ボタンのみが意図したとおりに機能します。下ボタンには、 ListView の最初に表示されているスクロール位置が更新されていないことが原因であると思われる問題があります。

下に押すと、以下に示すように onNavigationDownPressed() メソッドが発生します。これにより、ListView の firstVisiblePosition が 0 で開始され、ListView が正しい量だけ下にスクロールされます。次にそのメソッドが呼び出されたとき、最初に表示される位置は 0 のままです。

しかし、ListView を手動でわずかに下にスクロールしてから下に押すと、正しく下にスクロールし、同じことが起こります。最初にスクロールして位置を更新しない限り、firstVisiblePostion が変更されないため、それ以上下に行くことはありません。

// Scroll up
@Override
public void onNavigationUpPressed()
{       
    Log.i("MAKE UP, FIRST VISIBLE POSITION: ", String.valueOf(listView.getFirstVisiblePosition()));     
    listView.setSelectionFromTop(listView.getFirstVisiblePosition(), fragmentHeight);
}

// Scroll down
@Override
public void onNavigationDownPressed()
{
    Log.i("MAKE DOWN, FIRST VISIBLE POSITION: ", String.valueOf(listView.getFirstVisiblePosition()));       
    listView.setSelectionFromTop(listView.getFirstVisiblePosition(), -fragmentHeight);
}   

何か案は?

乾杯

4

2 に答える 2

0

おそらく、次のように呼び出す必要があります。

listView.smoothScrollToPosition(yourPosition);

別のルートは、アイテムのスクロールを手動で設定することですが、最初のアプローチがうまくいくはずです。

于 2013-07-18T11:57:13.110 に答える
0

解決:

ListView に onScrollListener を設定し、ListView がスクロールしたときに通知を受け取るほか、最初に表示されるアイテムのインデックス、画面に表示されるアイテムの総数などの便利なパラメーターの両方を通知したので、これらの変数を保存しました。

    listView.setOnScrollListener(new OnScrollListener()
    {           
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {}

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
        {
            Log.i("MMY: ", "Scroll");
            Log.i("MMY: ", "First visible item: " + String.valueOf(firstVisibleItem));
            Log.i("MMY: ", "Visible item count: " + String.valueOf(visibleItemCount));

            // The variables that belong to this class now equal ->
            General_Navigation_Fragment.this.visibleItemCount = visibleItemCount;
            General_Navigation_Fragment.this.firstVisibleItem = firstVisibleItem;

            totalCount = totalItemCount;                
        }
    });

下ボタンが押されると、最初に表示されたアイテムのインデックスを取得し、画面上に表示されているアイテムの数 (n) を取得してから、現在の位置 + n まで下にスクロールしました。上にスクロールするために逆のことをしただけです。

// Scroll up
@Override
public void onNavigationUpPressed()
{           
    currentVisibleItem = firstVisibleItem - visibleItemCount;

    if (currentVisibleItem < 0)
    {
        listView.setSelection(0);
    }
    else        
        listView.setSelection(currentVisibleItem - 1);
}

// Scroll down
@Override
public void onNavigationDownPressed()
{           
    currentVisibleItem = visibleItemCount + firstVisibleItem;

    listView.setSelection(currentVisibleItem - 1);  
}   

ListView にはさまざまなサイズの項目があるため、この方法が最も簡単な方法のように思えました。

于 2013-07-18T14:47:21.003 に答える