2012-08-31 15 views
10

Sto utilizzando un elenco per popolare un oggetto ListView(). L'utente è in grado di aggiungere elementi all'elenco. Tuttavia, ho bisogno che gli elementi siano visualizzati nella parte superiore di ListView. Come inserisco un articolo all'inizio della mia lista per visualizzarlo in ordine inverso?Visualizza nuovi elementi nella parte superiore di ListView

+0

Qual è la fonte dei dati? Se lo stai leggendo da un database, puoi sempre modificare l'ordine di ritorno della query con 'order by' o equivalente. – MrLore

risposta

10

È consigliabile utilizzare uno ArrayAdapter e utilizzare il metodo insert(T, int).

Es:

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

Ho appena scartato la mia lista e ho usato in modo eccessivo l'adattatore. Ha funzionato alla grande! Grazie. – rphello101

+0

Prego! – aymeric

20

L'elenco predefinito aggiunge elementi nella parte inferiore. Questo è il motivo per cui tutti i nuovi elementi che aggiungi verranno mostrati in fondo. Se si desidera che in ordine inverso, può essere prima di impostare a listadapter/vista invertire la lista

Qualcosa di simile:

Collections.reverse(yourList); 
+0

Buona idea, ma ho continuato ad aggiungere elementi alla lista e ho continuato a invertirla, essenzialmente aggiungerei, in modo alternato, un oggetto a ciascuna estremità della lista. Dato che ho bisogno di salvare i dati con SharedPreferences che salva solo i tipi di dati di base, sarebbe piuttosto complicato tenere traccia di due elenchi. – rphello101

+0

trovato whati stavo cercando. thankx – raj

+0

Va bene, ma non funziona quando provi con oggetti personalizzati + tag! – delive

3

Il ListView visualizza i dati come sono memorizzati nell'origine dati.

Quando si aggiunge il database, è necessario aggiungere gli elementi alla fine. Quindi, quando ricevi tutti i dati tramite l'oggetto Cursore e li assegni all'AdrayAdapter, è solo in questo ordine. In pratica dovresti provare a inserire i dati all'inizio del database, piuttosto che alla fine, magari con una data-ora.

Utilizzando ArrayList, lo si può fare da Collections.reverse(arrayList) o se si utilizza SQLite, è possibile utilizzare order by.

+0

No, penso che questo sia sbagliato. Per listview è necessario passare array/lista come input. Nel database, a meno che tu non abbia il timestamp di inserimento, non puoi fare nulla. – kosa

+0

@Nambari: mi dispiace. Quello che volevo dire in realtà era quello di recuperare i dati dal database usando un oggetto Cursor e poi inserirli in un ArrayAdapter. Qualcosa come questo http://stackoverflow.com/questions/5717732/how-do-i-display-data-from-my-database-in-a-listview. Aggiornerà la mia risposta Grazie per il tuo commento. – Swayam

0

Si può sempre avere un'indicazione della data in oggetti e ordinare la listview basato su quello ..

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 
     } 
    } 

ora ordinare l'elenco

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

Questo dovrebbe ordinare la lista in modo tale che il nuovo articolo andrà in primo piano

0

È sempre possibile utilizzare una LinkedList e quindi utilizzare il metodo addFirst() per aggiungere elementi all'elenco e avrà il comportamento desiderato (nuovi elementi nella parte superiore di ListView).

14

Un'altra soluzione senza modificare l'elenco originale, ignorare metodo getItem() nella adattatore

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

aggiornato: Esempio

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

Questa è una soluzione molto elegante. Ho apportato una piccola modifica in modo da poterlo utilizzare in ArrayAdapters anonimi che non espongono gli elementi di dati: 'return super.getItem (getCount() - 1 - position);' –

+0

Funziona ma quando si scorre il primo elemento nell'elenco sembra un duplicato per l'ultimo elenco di oggetti. Penso che questo problema abbia a che fare con il riciclo degli articoli listview (non sono sicuro). –

+0

Potrebbe dirci come sovrascrivere il metodo getItem() nell'adattatore? – Apurva

1

mBlogList è una vista riciclatore ...

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

È possibile aggiungere elemento all'inizio della lista: come

arraylist.add(0, object) 

allora sarà sempre visualizzare il nuovo elemento in alto.

Problemi correlati