2015-04-22 14 views
6

Nella nostra app di chat vogliamo utilizzare la nuova libreria per aggiornare la chat sulle modifiche del database. Dal momento che la nostra chat ha uno scorrimento infinito e la chat room può avere un elenco molto grande di messaggi, vogliamo dividere ArrayList fornito con l'adattatore Chat ListView in due elenchi. Controlla la grafica per l'idea. enter image description hereAdattatore Android ListView con due liste di array

  1. Vogliamo set point nel database di sopra del quale, i vecchi messaggi saranno interrogati dai normali query SQLite. E sotto quel punto vogliamo impostare SQLBrite, che ci porterà nuovi messaggi aggiunti al database.
  2. Ogni parte deve compilare la sua ArrayList corrispondente. E due liste di array dovrebbero essere combinate in un unico adattatore.

La mia domanda è possibile fare? Se sì, come possiamo combinare e gestire due liste di array dinamiche in adattatore singolo?

Modifica 1 1. Ho bisogno di mantenere la posizione di scorrimento durante la chat dal reset, e non lampeggia durante l'aggiornamento ArrayLists.

+1

Adopter accetterà solo un array, è necessario unire le due matrici. Devi trovare una soluzione per aggiornare gli elenchi in modo dinamico e riunire nuovamente – penguin

+0

perché non utilizzare un MergeCursor? – pskink

risposta

4

1. Con l'aiuto di farmaci generici è possibile gestire due arraylist con il singolo ArrayList.

Per esempio in adattatore:

setListData(ArrayList<T> pListData) 
{ 
    mListData=pListData; 
} 

In vista

getView(int position, View convertView, ViewGroup parent){ 

     T commonModel= getItem(position); 
    if(T instanceof ArrayListOneModel){ 
    ArrayListOneModel model1=(ArrayListOneModel)T; 
    do stuf for first arraylit... 
     } 
} 
  1. Se si utilizza lo stesso modello è possibile impostare un tipo (enum) per entrambi arraylist & durante l'orario di proiezione è possibile verificare che.

3.Otherwise è possibile aggiungere innanzitutto i vecchi dati in arraylist & quindi utilizzando la raccolta addAll() aggiungere 2 ° ultimo elenco dei messaggi in esso. poi

adapter.notifyDataSetChanged() 

imposterà primo messaggio vecchio poi fisserà ultimo messaggio nella tua lista

maggiori chiarimenti: Nel secondo approccio, se si dispone di modelli diversi sia per arraylist quindi contiene un enum in entrambe modello come un setter getter.

public enum eType{ 
    FIRST_LIST_TYPE,SECOND_LIST_TYPE 
    } 

Durante il recupero dei dati da diversi set di DB Digitare nel modello. e.g

public class model{ 
    private enum eType; 

// altro valore getter setter dal vostro DB /** * getter Setter: */

public void seteType(enum eType) 
    { 
     this.eType = eType; 
    } 
    public enum geteType() 
    { 
     return eType; 
    } 

    } 

Durante il recupero insieme di dati Digitare per esempio

Model model = new Model(); 
model.seteType(eType.FIRST_LIST_TYPE) ; 
    //same for 2nd db. 
& simply check type inside getView() according to your requirement. 
+0

Ho usato la terza opzione –

+0

@Deepanker Potresti spiegare un po 'di più sulla seconda soluzione con lo snippet di codice – Praveen

+0

@Praveen Ho aggiunto ulteriori chiarimenti per il 2o approccio. Ma il 3o approccio è il migliore non è necessario controllare qualsiasi tipo solo addAll aggiungerà tutti i dati. –

2
yes that is possible inside BaseAdapter getCount method write following code 

@Override 
public int getItemCount() { 
    return list1.size()+list2.size(); 
} 

e dentro il metodo GetView si può fare qualcosa di simile sotto

public View getView(int position, View convertView, ViewGroup viewGroup) { 
     if(position < list1.size) { 
      Object object = list1.get(position); 
      //write code to inflate view here related to list 1 

     } 
     else { 
      Object object = list2.get(position - list1.size()); 
      //write code to inflate raw here related to list 2 
     } 
} 
1

Sì, puoi farlo. ma entrambi gli arraylist dovrebbero avere un formato dati comune. per esempio .. In adattatore è possibile effettuare metodo come

public void addMessages(<your_array_list> data) { 
    list.addAll(data); //where list is your data container 
} 

ora si può avere due arraylist come

ArrayList<your_type> oldMsg; 
ArrayList<your_type> newMsg; 
.. 
.. 
... 
. 
. 

così si può chiamare il metodo adattatore che abbiamo creato

yourAdapter.addMessages(oldMsg); 
yourAdapter.addMessages(newMsg); 
+1

non dimenticare di scrivere notifyDataSetChanged() – Moinkhan

1

È possibile passare solo una lista in adottore, il che significa che è necessario unire entrambi gli array. Per unire entrambi gli array. devono essere dello stesso tipo, cioè matrice dello stesso oggetto personalizzato.

Se le matrici sono l'aggiornamento dinamico, quindi unire gli array di nuovo, come le loro modifiche dei dati, e chiamare notifyDataSetChanged() di volta in volta, alla luce delle modifiche dell'elenco articolo

Problemi correlati