2015-04-22 24 views
6

W naszej aplikacji do czatu chcemy użyć nowej, fajnej biblioteki SQLBrite, aby zaktualizować czat w przypadku zmian w bazie danych. Ponieważ nasz czat ma nieskończone przewijanie, a czat może zawierać bardzo dużą listę wiadomości, chcemy podzielić ArrayList na adapter Chat ListView na dwie listy. Sprawdź grafikę idei. enter image description hereAdapter Android ListView z dwiema ArrayListami

  1. Chcemy, aby ustawić punkt w bazie danych, powyżej której, stare wiadomości będą przeszukiwać za normalnych SQLite zapytaniami. A poniżej tego punktu chcemy ustawić SQLBrite, który przyniesie nam nowe wiadomości dodane do bazy danych.
  2. Każda część powinna zapełnić odpowiednią ArrayList. I dwie listy tablic powinny być połączone w jeden adapter.

Moje pytanie jest możliwe? Jeśli tak, możemy połączyć i obsłużyć dwie dynamiczne ArrayLists w pojedynczym adapterze?

Edycja 1 1. Muszę zachować pozycję przewijania czatu podczas resetowania i nie migać podczas aktualizacji ArrayLists.

+1

Adopter zaakceptuje tylko jedną tablicę, trzeba połączyć obie tablice. Musisz znaleźć rozwiązanie do dynamicznego aktualizowania list i ponownego łączenia – penguin

+0

, dlaczego nie używać MergeCursor? – pskink

Odpowiedz

4

1.Z pomocą leków generycznych można obsługiwać dwa ArrayList z pojedynczą ArrayList.

Na przykład w adapterze:

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

W widoku

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. Jeśli używasz tego samego modelu można ustawić typ (enum) zarówno arraylist & podczas seansu czasu możesz to sprawdzić.

3.Otherwise można najpierw dodać stare dane w ArrayList & następnie przy użyciu kolekcji AddAll() dodać najnowszą listę 2nd wiadomość w nim. następnie

adapter.notifyDataSetChanged() 

ustawi pierwszy starą wiadomość następnie ustawi ostatnią wiadomość na liście

Więcej Wyjaśnienie: W drugim podejściu, jeśli mają różne modele zarówno dla ArrayList następnie zawierać wyliczenia zarówno w modelu jako zdobywca seterów.

public enum eType{ 
    FIRST_LIST_TYPE,SECOND_LIST_TYPE 
    } 

Podczas pobierania danych z innego zestawu DB Wpisz model. e.g

public class model{ 
    private enum eType; 

// inna wartość setter getter z DB /** * Setter getter: */

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

    } 

Podczas pobierania zestawu danych Wpisz np

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

Użyłem trzeciej opcji –

+0

@Deepanker Czy mógłbyś wyjaśnić nieco więcej o drugim rozwiązaniu z fragmentem kodu? – Praveen

+0

@Praveen Dodałem więcej wyjaśnień dla drugiego podejścia. Ale trzecie podejście najlepiej nie trzeba sprawdzać żadnego typu tylko addAll doda wszystkie dane. –

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

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

i wewnątrz metody getView można coś zrobić jak poniżej

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

Tak, możesz to zrobić. ale obie listy powinny mieć wspólny format danych. dla np .. W adapterze można dokonać metodą jak

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

teraz możesz mieć dwa ArrayList jak

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

więc można wywołać metodę adaptera który stworzyliśmy

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

nie zapomnij napisać notifyDataSetChanged() – Moinkhan

1

Możesz przekazać tylko jedną listę w programie adoptującym, co oznacza, że ​​musisz scalić obie tablice. Aby połączyć obie tablice. muszą być tego samego typu, to jest Array z tego samego obiektu niestandardowego.

Jeśli tablice są dynamicznie aktualizacji, a następnie ponownie scalić tablic, jak ich zmiany danych i wywołać notifyDataSetChanged() za każdym razem, aby odzwierciedlić zmiany w ListView