2012-08-31 5 views
10

Ich verwende eine Liste zum Auffüllen eines ListView(). Der Benutzer kann Elemente zur Liste hinzufügen. Ich brauche jedoch die Elemente, die oben in der ListView angezeigt werden. Wie füge ich ein Element am Anfang meiner Liste ein, um es in umgekehrter Reihenfolge anzuzeigen?Neue Elemente oben in einem ListView anzeigen

+0

Woher stammen die Daten? Wenn Sie es aus einer Datenbank lesen, können Sie die Reihenfolge, in der die Abfrage zurückgegeben wird, jederzeit mit 'order by' oder äquivalent ändern. – MrLore

Antwort

10

Sie sollten wahrscheinlich eine ArrayAdapter verwenden und die insert(T, int) Methode verwenden.

Ex:

ListView lv = new ListView(context); 
ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, R.id...); 
lv.setAdapter(adapter); 
... 
adapter.insert("Hello", 0); 
+0

Ich habe gerade meine Liste verschrottet und nutze den Adapter. Hat super funktioniert! Vielen Dank. – rphello101

+0

Gern geschehen! – aymeric

20

Standardmäßig fügt die Liste Elemente unten hinzu. Aus diesem Grund werden alle neuen Elemente, die Sie hinzufügen, unten angezeigt. Wenn Sie es in umgekehrter Reihenfolge wollen, sein kann, bevor Sie zu listadapter/Ansicht kehren Sie die Liste

Etwas wie:

Collections.reverse(yourList); 
+0

Gute Idee, aber ich fügte immer wieder Elemente in die Liste ein und änderte es ständig. Ich würde im Prinzip abwechselnd ein Element an jedem Ende der Liste hinzufügen. Da ich die Daten mit SharedPreferences speichern muss, die nur grundlegende Datentypen speichern, wäre es sehr mühsam, zwei Listen zu verfolgen. – rphello101

+0

gefunden, was ich suchte. thankx – raj

+0

Ist gut, aber nicht funktionieren, wenn Sie mit Objekten benutzerdefinierte + Tags versuchen! – delive

3

Das Listview die Daten anzeigt, wie es in der Datenquelle gespeichert ist.

Wenn Sie Ihre Datenbank hinzufügen, müssen am Ende die Elemente hinzugefügt werden. Wenn Sie also alle Daten über das Cursor-Objekt erhalten und es dem ArrayAdapter zuweisen, liegt es nur in dieser Reihenfolge vor. Sie sollten im Grunde versuchen, Daten an den Anfang der Datenbank zu stellen, anstatt am Ende vielleicht einen Zeitstempel zu haben.

Arraylist verwenden, können Sie es tun, indem Collections.reverse(arrayList) oder wenn Sie SQLite verwenden, können Sie order by verwenden.

+0

Nein, ich denke, das ist falsch. Für die Listenansicht müssen Sie Array/Liste als Eingabe übergeben. In der Datenbank können Sie nichts tun, es sei denn, Sie haben Zeitstempel für das Einfügen. – kosa

+0

@Nambari: Es tut mir leid. Was ich eigentlich meinte, war, dass die Daten mithilfe eines Cursor-Objekts aus der Datenbank abgerufen und in einen ArrayAdapter eingefügt werden. So etwas wie http://stackoverflow.com/questions/5717732/how-do-i-display-data-from-my-database-in-a-listview. Wird meine Antwort aktualisieren. Vielen Dank für Ihren Kommentar. – Swayam

0

Man konnte immer einen Zeitstempel in Ihre Objekte haben und Ihre Listenansicht auf dieser Grundlage sortieren ..

public class CustomComparator implements Comparator<YourObjectName> { 
     public int compare(YourObjectName o1, YourObjectName o2) { 
      return o1.getDate() > o2.getDate() // something like that.. google how to do a compare method on two dates 
     } 
    } 

jetzt sortieren Sie Ihre Liste

Collections.sort(YourList, new CustomComparator()); 

Diese sollten Sie Ihre Liste so sortieren, dass das neueste Element an die Spitze geht

0

Sie können stattdessen immer eine LinkedList verwenden und dann die addFirst() -Methode verwenden, um Elemente zu Ihrer Liste hinzuzufügen, und es wird das gewünschte Verhalten haben (neue Elemente am Anfang der ListView).

14

Eine andere Lösung, ohne die ursprüngliche Liste zu ändern, außer Kraft setzen getItem() Methode in dem Adapter

@Override 
public Item getItem(int position) { 
    return super.getItem(getCount() - position - 1); 
} 

aktualisiert: Beispiel

public class ChatAdapter extends ArrayAdapter<ChatItem> { 
public ChatAdapter(Context context, List<ChatItem> chats) { 
    super(context, R.layout.row_chat, chats); 
} 

@Override 
public Item getItem(int position) { 
    return super.getItem(getCount() - position - 1); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if(convertView == null) { 
     convertView = inflater.inflate(R.layout.row_chat, parent, false); 
    } 

    ChatItem chatItem = getItem(position); 
    //Other code here 

    return convertView; 
} 

}

+1

Dies ist eine sehr elegante Lösung. Ich habe eine kleine Änderung vorgenommen, damit ich sie in anonymen ArrayAdaptern verwenden kann, die die Datenelemente nicht verfügbar machen: 'return super.getItem (getCount() - 1 - position);' –

+0

Dies funktioniert aber beim Scrollen des ersten Eintrags in der Liste erscheint wie ein Duplikat zur letzten Artikelliste. Ich denke, dieses Problem hat mit dem Recycling der Listview-Elemente zu tun (nicht sicher). –

+0

Könnten Sie bitte erzählen, wie getItem() Methode im Adapter überschrieben wird? – Apurva

1

mBlogList ist eine Ansicht ... Recycler

mBlogList=(RecyclerView) findViewById(R.id.your xml file); 
mBlogList.setHasFixedSize(true); 


LinearLayoutManager mLayoutManager = new LinearLayoutManager(this); 
mLayoutManager.setReverseLayout(true); 
mLayoutManager.setStackFromEnd(true); 
mBlogList.setLayoutManager(mLayoutManager);//VERTICAL FORMAT 
0

Sie können Element am Anfang der Liste hinzufügen: wie

arraylist.add(0, object) 

dann wird es immer an der Spitze das neue Element angezeigt werden soll.

Verwandte Themen