プログラムでAndroid ListViewの特定の位置までスクロールする


157

プログラムで特定の位置までスクロールするにはどうすればよいListViewですか?

たとえば、私はを持っているString[] {A,B,C,D....}ので、の一番上の可視アイテムListViewをのインデックス21 に設定する必要がありString[]ます。



ここで私の回答をご覧ください。stackoverflow.com/ a / 29345217/1881527
メルボルンロペス

回答:


386

直接スクロールの場合:

getListView().setSelection(21);

スムーズにスクロールするには:

getListView().smoothScrollToPosition(21);

かっこいい、これがまさに私が欲しいものです!
jiasli 2013

すごく、とても便利です。時間を節約できます。ありがとう。
Neha Agarwal

別の違い:最初のものはリストの真ん中に設定しようとします。
ビクターピント

11
smoothScrollToPosition機能していません、何か提案がありますか?
SweetWisherツ

1
@SweetWisherツポスト遅延しようと実行、のようなもの:listView.post(() -> listView.smoothScrollToPosition());
アンディRES

64

スクロール時間のあるSmoothScrollの場合:

getListView().smoothScrollToPositionFromTop(position,offset,duration);

パラメータ
位置->
オフセットまでスクロールする位置---->スクロールが完了したときのビューの上部からの位置のピクセル単位の望ましい距離
継続時間-> スクロールに使用するミリ秒数

注: API 11以降。

HandlerExploitの答えは私が探していたものでしたが、私のリストビューは非常に長く、アルファベットスクローラーもあります。次に、同じ関数が他のパラメーターも取ることができることを発見しました:)


編集:(AFDの提案から)

現在の選択を配置するには:

int h1 = mListView.getHeight();
int h2 = listViewRow.getHeight();

mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration);  

正常に動作します。回答を改善するために、stackoverflow.com
questions

v.getHeight()とは何ですか?
Panache

@Panache vはリストビューの行です
amalBit

私はyouuuuuuを愛しています
ジョアンフェレイラ

10

次のようにコードをハンドラーに入れ、

public void timerDelayRunForScroll(long time) {
        Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() {           
            public void run() {   
                try {
                    lstView.smoothScrollToPosition(YOUR_POSITION);
                } catch (Exception e) {}
            }
        }, time); 
    }

次に、このメソッドを次のように呼び出します。

timerDelayRunForScroll(100);

乾杯!!!


7

OnGroupExpandListenerを設定し、onGroupExpand()を次のようにオーバーライドしました。

選択されたアイテムを設定し、ListViewの上端からyピクセルの選択を配置するsetSelectionFromTop()メソッドを使用します。(タッチモードの場合、アイテムは選択されませんが、適切に配置されます。)(android docs)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

            expList.setSelectionFromTop(groupPosition, 0);
            //your other code
        }
    });

lisviewをスクロールしながら、同時に別のビューをスクロールする必要があります。スクロールのためにリストビューでsetSelectionFromTopを使用すると、UIスレッドがブロックされ、別のビューのスクロールが遅くなります。それを行う方法についていくつかの提案を与えることができますか?
VijayRaj 2014年

7

Listviewスクロールはデフォルトでトップに位置付けますが、表示されていないが、その後、これを使用している場合、スクロールしたいされます。

if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
            listView1.setSelection(position);

ありがとう@zalak私の問題を解決し、あなたをあきらめてください
Mitul Bhadeshiya 2016年

5

Gmailアプリのような同様の機能を探している人がいる場合、

リストビューのスクロールは、デフォルトで上に配置されます。ヒントをありがとう。amalBit。差し引くだけです。それでおしまい。

 Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            int h1 = mDrawerList.getHeight();
            int h2 = header.getHeight();
            mDrawerList.smoothScrollToPosition(h2-h1);
        }
    }, 1000);

4

.buttonを使用したUP / Downを使用したlistViewスクロールの処理

ボタンを使用してリストビューを1行上/下に処理することに関心がある場合。その後。

public View.OnClickListener onChk = new View.OnClickListener() {
             public void onClick(View v) {

                 int index = list.getFirstVisiblePosition();
                 getListView().smoothScrollToPosition(index+1); // For increment. 

}
});

現在の位置を取得する方法を示したのはあなただけなので、賛成票を差し上げますが、例を改善する必要があります。
Panciz 2015年

4

listViewの目的の位置に直接ジャンプしたい場合は、

listView.setSelection(int position);

リストビューの目的の位置にスムーズにジャンプしたい場合は、

listView.smoothScrollToPosition(int position);


3

これは私のために働いたものです。amalBitとメルボルンロペスによる回答の組み合わせ

public void timerDelayRunForScroll(long time) {
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() {           
        public void run() {   
            try {
                  int h1 = mListView.getHeight();
                  int h2 = v.getHeight();

                  mListView.smoothScrollToPositionFromTop(YOUR_POSITION, h1/2 - h2/2, 500);  

            } catch (Exception e) {}
        }
    }, time); 
}

そして、このメソッドを次のように呼び出します:

timerDelayRunForScroll(400);

1

その簡単なlist-view.set選択(あなたはpos); またはあなたはsharedprefrenceであなたの位置を保存することができます、そしてあなたが活動を始めるときそれはそのintへの好みとsetseletionを得ます


私がやりたかったことは、スクロールアニメーションなしで自動的にリストの一番上に移動することでした...これはそのために完璧に機能しました
RH201

1

-リストを特定の位置まで上にスクロール\夜明けしたい場合:

myListView.smoothScrollToPosition(i);

-myListView内の特定のアイテムの位置を取得する場合:

myListView.getItemAtPosition(i);

-これmyListView.getVerticalScrollbarPosition(i);も役立ちます。

幸運を :)


0

listViewのスクロール位置を正確に定義するには、次の2つが必要です。

現在のlistViewスクロール位置を取得するには:

int firstVisiblePosition = listView.getFirstVisiblePosition(); 
int topEdge=listView.getChildAt(0).getTop(); //This gives how much the top view has been scrolled.

listViewのスクロール位置を設定するには:

listView.setSelectionFromTop(firstVisiblePosition,0);
// Note the '-' sign for scrollTo.. 
listView.scrollTo(0,-topEdge);

-1

私はこの解決策を見つけ、2つの異なるボタンを使用して上下にスクロールできるようにしました。

@Nepsterで提案されているように、getFirstVisiblePosition()およびgetLastVisiblePosition()を使用してプログラムでスクロールを実装し、現在の位置を取得します。

final ListView lwresult = (ListView) findViewById(R.id.rds_rdi_mat_list);
    .....

        if (list.size() > 0) {
            ImageButton bnt = (ImageButton) findViewById(R.id.down_action);
            bnt.setVisibility(View.VISIBLE);
            bnt.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(lwresult.getLastVisiblePosition()<lwresult.getAdapter().getCount()){
                        lwresult.smoothScrollToPosition(lwresult.getLastVisiblePosition()+5);
                    }else{
                        lwresult.smoothScrollToPosition(lwresult.getAdapter().getCount());

                    }
                }
            });
            bnt = (ImageButton) findViewById(R.id.up_action);
            bnt.setVisibility(View.VISIBLE);

            bnt.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(lwresult.getFirstVisiblePosition()>0){
                        lwresult.smoothScrollToPosition(lwresult.getFirstVisiblePosition()-5);
                    }else{
                        lwresult.smoothScrollToPosition(0);
                    }

                }
            });
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.