Jak programowo przewinąć do określonej pozycji w ListView
?
Na przykład mam String[] {A,B,C,D....}
i muszę ustawić górną widoczną pozycję ListView
na indeks 21 mojego String[]
.
Jak programowo przewinąć do określonej pozycji w ListView
?
Na przykład mam String[] {A,B,C,D....}
i muszę ustawić górną widoczną pozycję ListView
na indeks 21 mojego String[]
.
Odpowiedzi:
W przypadku bezpośredniego przewijania:
getListView().setSelection(21);
Aby uzyskać płynne przewijanie:
getListView().smoothScrollToPosition(21);
smoothScrollToPosition
nie działa, jakaś sugestia?
listView.post(() -> listView.smoothScrollToPosition());
getListView().smoothScrollToPositionFromTop(position,offset,duration);
Parametry
position -> Position to scroll to
offset ----> Żądana odległość w pikselach pozycji od góry widoku po zakończeniu przewijania
czas trwania -> Liczba milisekund do wykorzystania do przewijania
Uwaga: z API 11.
Odpowiedź HandlerExploit była tym, czego szukałem, ale mój widok listy jest dość długi i zawiera również przewijanie alfabetu. Potem stwierdziłem, że ta sama funkcja może przyjmować również inne parametry :)
Edytować: (z sugestii AFD)
Aby ustawić bieżący wybór:
int h1 = mListView.getHeight();
int h2 = listViewRow.getHeight();
mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration);
Umieść swój kod w module obsługi w następujący sposób,
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);
}
a następnie wywołaj tę metodę w następujący sposób:
timerDelayRunForScroll(100);
TWOJE ZDROWIE!!!
Ustawiłem OnGroupExpandListener i zastąpiłem onGroupExpand () jako:
i użyj metody setSelectionFromTop (), która ustawia wybrany element i umieszcza zaznaczenie y pikseli od górnej krawędzi ListView. (W trybie dotykowym element nie zostanie wybrany, ale nadal będzie odpowiednio pozycjonowany) (dokumentacja systemu Android)
yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
{
@Override
public void onGroupExpand(int groupPosition) {
expList.setSelectionFromTop(groupPosition, 0);
//your other code
}
});
Listview
Przewijania zostanie umieszczony na górze domyślnie, ale jeśli chcesz, aby przewinąć niewidoczny następnie użyj tego:
if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
listView1.setSelection(position);
Jeśli ktoś szuka podobnej funkcji, takiej jak aplikacja Gmail,
Przewijanie widoku listy zostanie domyślnie umieszczone na górze. Dzięki za podpowiedź. amalBit. Po prostu odejmij to. Otóż to.
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);
Obsługa listy Przeglądanie przewijania za pomocą przycisku W GÓRĘ / W DÓŁ
Jeśli ktoś jest zainteresowany obsługą listy, wyświetl jeden wiersz w górę / w dół za pomocą przycisku. następnie.
public View.OnClickListener onChk = new View.OnClickListener() {
public void onClick(View v) {
int index = list.getFirstVisiblePosition();
getListView().smoothScrollToPosition(index+1); // For increment.
}
});
To właśnie zadziałało dla mnie. Połączenie odpowiedzi AmalBit i 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);
}
a następnie wywołaj tę metodę na przykład:
timerDelayRunForScroll(400);
jego łatwy wybór list-view.set (pozujesz); lub możesz zapisać swoją pozycję z sharedprefrence, a kiedy zaczniesz aktywność, otrzymasz preferencje i ustawisz wybór na ten int
-Jeśli chcesz, aby lista przewinęła się w górę \ świt do określonej pozycji:
myListView.smoothScrollToPosition(i);
-jeśli chcesz uzyskać pozycję konkretnego elementu w myListView:
myListView.getItemAtPosition(i);
-Również to myListView.getVerticalScrollbarPosition(i);
może ci pomóc.
Powodzenia :)
Do precyzyjnego zdefiniowania pozycji przewijania listView potrzebne są dwie rzeczy:
Aby uzyskać aktualną listę Wyświetl pozycję przewijania:
int firstVisiblePosition = listView.getFirstVisiblePosition();
int topEdge=listView.getChildAt(0).getTop(); //This gives how much the top view has been scrolled.
Aby ustawić pozycję przewijania widoku listy:
listView.setSelectionFromTop(firstVisiblePosition,0);
// Note the '-' sign for scrollTo..
listView.scrollTo(0,-topEdge);
Znalazłem to rozwiązanie, które umożliwia przewijanie w górę iw dół za pomocą dwóch różnych przycisków.
Zgodnie z sugestią @Nepster implementuję przewijanie programowo przy użyciu funkcji getFirstVisiblePosition () i getLastVisiblePosition (), aby uzyskać bieżącą pozycję.
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);
}
}
});
}