2015-04-22 60 views
6

在我們的聊天應用程序中,我們希望使用很酷的新庫SQLBrite來更新有關數據庫更改的聊天。由於我們的聊天有無盡的滾動,並且聊天室可以有很大的消息列表,我們想要將提供給Chat ListView適配器的ArrayList分成兩個列表。檢查圖形的想法。 enter image description here帶有兩個ArrayList的Android ListView適配器

  1. 我們要設置數據庫點以上這些,舊信息將通過正常的SQLite查詢進行查詢。而在此之下,我們需要設置SQLBrite,這將爲我們帶來新的消息添加到數據庫。
  2. 每個部分應該填充其對應的ArrayList。兩個arrayLists應該合併到一個適配器中。

我的問題是可以做到的嗎?如果是,我們如何在單個適配器中組合和處理兩個動態ArrayList?

編輯1 1.我需要在重置期間保持聊天滾動位置,並且ArrayLists更新期間沒有閃爍。

+1

採納者將只接受一個數組,你必須合併兩個數組。您必須找到動態更新列表的解決方案並重新合併 – penguin

+0

爲什麼不使用MergeCursor? – pskink

回答

4

1.採用仿製藥的幫助,您可以處理兩個數組列表單的ArrayList。

例如在適配器:

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

在View

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

     T commonModel= getItem(position); 
    if(T instanceof ArrayListOneModel){ 
    ArrayListOneModel model1=(ArrayListOneModel)T; 
    do stuf for first arraylit... 
     } 
} 
  • 如果使用相同的模型可以設置爲兩個類型(枚舉) arraylist &在顯示時間內你可以檢查。
  • 3.Otherwise你可以先在數組列表&然後添加使用收集 中的addAll()在其添加第二個最新的消息列表舊數據。然後

    adapter.notifyDataSetChanged() 
    

    將設置第一個舊的消息,然後將您的列表中設置的最新消息

    更多的澄清: 在第二個方法,如果你有不同的模型,這兩個數組列表然後包含在這兩個模型作爲枚舉一個setter getter。

    public enum eType{ 
        FIRST_LIST_TYPE,SECOND_LIST_TYPE 
        } 
    

    從不同數據庫集中獲取數據在模型中輸入類型。 e。從DB克

    public class model{ 
        private enum eType; 
    

    //其他設定器吸氣值 /** * 設定器吸氣劑: */

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

    在獲取數據集類型例如

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

    我使用了第三個選項 –

    +0

    @Deepanker您能否解釋一下更多關於第二個解決方案的代碼片段 – Praveen

    +0

    @Praveen我已經爲第二種方法添加了更多的說明。但第三種方法是最好不需要檢查任何類型只有addAll會添加所有數據。 –

    2
    yes that is possible inside BaseAdapter getCount method write following code 
    
    @Override 
    public int getItemCount() { 
        return list1.size()+list2.size(); 
    } 
    

    和getView方法中,你可以做類似下面

    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

    是的,你可以做到這一點。但這兩個arraylist應該有共同的數據格式。 用於如.. 在適配器可以讓喜歡

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

    方法現在可能有兩個數組列表 像

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

    ,所以你可以撥打我們已經創建了適配器方法

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

    別忘了寫notifyDataSetChanged() – Moinkhan

    1

    您可以在採用者中僅傳遞一個列表,這意味着您必須合併這兩個數組。 爲了合併這兩個數組。它們必須是相同的類型,即相同自定義對象的數組。

    如果陣列動態更新,然後再合併陣列,其數據變化,並調用notifyDataSetChanged()各一次,以反映列表視圖改變