プログラムで特定の位置までスクロールするにはどうすればよいListView
ですか?
たとえば、私はを持っているString[] {A,B,C,D....}
ので、の一番上の可視アイテムListView
をのインデックス21 に設定する必要がありString[]
ます。
プログラムで特定の位置までスクロールするにはどうすればよいListView
ですか?
たとえば、私はを持っているString[] {A,B,C,D....}
ので、の一番上の可視アイテムListView
をのインデックス21 に設定する必要がありString[]
ます。
回答:
直接スクロールの場合:
getListView().setSelection(21);
スムーズにスクロールするには:
getListView().smoothScrollToPosition(21);
smoothScrollToPosition
機能していません、何か提案がありますか?
listView.post(() -> listView.smoothScrollToPosition());
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);
次のようにコードをハンドラーに入れ、
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);
乾杯!!!
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
}
});
Listview
スクロールはデフォルトでトップに位置付けますが、表示されていないが、その後、これを使用している場合、スクロールしたいされます。
if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
listView1.setSelection(position);
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);
.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.
}
});
これは私のために働いたものです。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);
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);
私はこの解決策を見つけ、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);
}
}
});
}