Как программно прокрутить до определенной позиции в 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);
Параметры
position -> Position для прокрутки до
смещения ----> Желаемое расстояние в пикселях от позиции от верхней части представления, когда прокрутка завершена,
продолжительность -> Количество миллисекунд, используемых для прокрутки
Примечание: из API 11.
Ответ HandlerExploit был тем, что я искал, но мой просмотр списка довольно длинный, а также с алфавитной прокруткой. Тогда я обнаружил, что та же функция может принимать и другие параметры :)
Изменить: (Из предложения AFDs)
Чтобы разместить текущий выбор:
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);
CHEERS !!!
Я установил OnGroupExpandListener и переопределил onGroupExpand () как:
и использовать метод setSelectionFromTop (), который устанавливает выбранный элемент и размещает выделенные пиксели y от верхнего края ListView. (Если в сенсорном режиме, элемент не будет выбран, но он все равно будет располагаться соответствующим образом.) (Документы для Android)
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,
По умолчанию свиток Listview будет располагаться сверху. Спасибо за подсказку. 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);
Обработка прокрутки listView с помощью UP / Down с помощью .button
Если кто-то заинтересован в обработке списка, просмотрите одну строку вверх / вниз, используя кнопку. затем.
public View.OnClickListener onChk = new View.OnClickListener() {
public void onClick(View v) {
int index = list.getFirstVisiblePosition();
getListView().smoothScrollToPosition(index+1); // For increment.
}
});
Это то, что сработало для меня. Комбинация ответов от amalBit & Melbourne Lopes
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);
его легкий выбор list-view.set (вы поз); или вы можете сохранить свою позицию с помощью sharedprefrence, и, когда вы начинаете деятельность, она получает настройки и выбирает этот int
-Если вы просто хотите, чтобы список прокручивался вверх \ до определенной позиции:
myListView.smoothScrollToPosition(i);
-Если вы хотите получить позицию определенного элемента в myListView:
myListView.getItemAtPosition(i);
-Также это myListView.getVerticalScrollbarPosition(i);
может помочь вам.
Удачи :)
Вам нужно две вещи, чтобы точно определить положение прокрутки listView:
Чтобы получить текущую позицию прокрутки 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);
Я нашел это решение, чтобы позволить прокручивать вверх и вниз, используя две разные кнопки.
По предложению @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);
}
}
});
}