Wie kann ich programmgesteuert zu einer bestimmten Position in einem scrollen ListView
?
Zum Beispiel habe ich eine String[] {A,B,C,D....}
, und ich muss das oberste sichtbare Element von ListView
auf den Index 21 von my setzen String[]
.
Wie kann ich programmgesteuert zu einer bestimmten Position in einem scrollen ListView
?
Zum Beispiel habe ich eine String[] {A,B,C,D....}
, und ich muss das oberste sichtbare Element von ListView
auf den Index 21 von my setzen String[]
.
Antworten:
Für eine direkte Schriftrolle:
getListView().setSelection(21);
Für eine reibungslose Schriftrolle:
getListView().smoothScrollToPosition(21);
smoothScrollToPosition
funktioniert nicht, irgendein Vorschlag?
listView.post(() -> listView.smoothScrollToPosition());
getListView().smoothScrollToPositionFromTop(position,offset,duration);
Parameter
Position -> Position zum
Scrollen zum Versatz ----> Gewünschter Abstand in Pixel der Position vom oberen Rand der Ansicht, wenn der Bildlauf abgeschlossen ist
Dauer-> Anzahl der Millisekunden, die für den Bildlauf verwendet werden sollen
Hinweis: Ab API 11.
Die Antwort von HandlerExploit war genau das, wonach ich gesucht habe, aber meine Listenansicht ist ziemlich lang und auch mit Alphabet-Scroller. Dann habe ich festgestellt, dass dieselbe Funktion auch andere Parameter annehmen kann :)
Bearbeiten: (Aus AFDs Vorschlag)
So positionieren Sie die aktuelle Auswahl:
int h1 = mListView.getHeight();
int h2 = listViewRow.getHeight();
mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration);
Geben Sie Ihren Code wie folgt in den Handler ein:
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);
}
und rufen Sie diese Methode dann wie folgt auf:
timerDelayRunForScroll(100);
PROST!!!
Ich habe OnGroupExpandListener festgelegt und onGroupExpand () wie folgt überschrieben:
Verwenden Sie die Methode setSelectionFromTop (), mit der das ausgewählte Element festgelegt und die Auswahl y Pixel vom oberen Rand der ListView positioniert wird. (Im Touch-Modus wird das Element nicht ausgewählt, aber dennoch entsprechend positioniert.) (Android-Dokumente)
yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
{
@Override
public void onGroupExpand(int groupPosition) {
expList.setSelectionFromTop(groupPosition, 0);
//your other code
}
});
Der Listview
Bildlauf wird standardmäßig nach oben positioniert, Sie möchten jedoch einen Bildlauf durchführen, wenn er nicht sichtbar ist. Verwenden Sie dann Folgendes:
if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
listView1.setSelection(position);
Wenn jemand nach einer ähnlichen Funktionalität wie der Google Mail-App sucht,
Der Listenansicht-Bildlauf wird standardmäßig nach oben positioniert. Danke für den Tipp. amalBit. Subtrahiere es einfach. Das ist es.
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);
Umgang mit ListView-Scrollen mit UP / Down mit der Taste
Wenn jemand daran interessiert ist, listView eine Zeile nach oben / unten mit der Schaltfläche. dann.
public View.OnClickListener onChk = new View.OnClickListener() {
public void onClick(View v) {
int index = list.getFirstVisiblePosition();
getListView().smoothScrollToPosition(index+1); // For increment.
}
});
Wenn Sie in einer Listenansicht direkt zur gewünschten Position springen möchten, verwenden Sie einfach
listView.setSelection (int position);
und wenn Sie reibungslos zur gewünschten Position in listView springen möchten, verwenden Sie einfach
listView.smoothScrollToPosition (int position);
Das hat bei mir funktioniert. Kombination der Antworten von 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);
}
und rufen Sie diese Methode dann wie folgt auf:
timerDelayRunForScroll(400);
seine einfache list-view.set Auswahl (Sie pos); oder Sie können Ihre Position mit sharedprefrencean speichern und beim Starten der Aktivität Einstellungen und Einstellungen auf diesen int erhalten
-Wenn Sie nur möchten, dass die Liste nach oben zu einer bestimmten Position rollt:
myListView.smoothScrollToPosition(i);
-wenn Sie die Position eines bestimmten Elements in myListView abrufen möchten:
myListView.getItemAtPosition(i);
-auch das myListView.getVerticalScrollbarPosition(i);
kann dir helfen.
Viel Glück :)
Sie benötigen zwei Dinge, um die Bildlaufposition einer listView genau zu definieren:
So erhalten Sie die aktuelle listView-Bildlaufposition:
int firstVisiblePosition = listView.getFirstVisiblePosition();
int topEdge=listView.getChildAt(0).getTop(); //This gives how much the top view has been scrolled.
So legen Sie die listView-Bildlaufposition fest:
listView.setSelectionFromTop(firstVisiblePosition,0);
// Note the '-' sign for scrollTo..
listView.scrollTo(0,-topEdge);
Ich habe diese Lösung gefunden, um das Scrollen mit zwei verschiedenen Tasten nach oben und unten zu ermöglichen.
Wie von @Nepster vorgeschlagen, implementiere ich den Bildlauf programmgesteuert mit getFirstVisiblePosition () und getLastVisiblePosition (), um die aktuelle Position abzurufen.
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);
}
}
});
}