Android ListView адаптер с два ArrayLists

В нашето приложение за чат искаме да използваме страхотна нова библиотека SQLBrite, за да актуализираме чата при промени в базата данни. Тъй като нашият чат има безкрайно превъртане, а стаята за чат може да има много голям списък от съобщения, искаме да разделим ArrayList, предоставен на адаптера Chat ListView, на два списъка. Проверете графиката за идеята. въведете описание на изображението тук

  1. Искаме да зададем точка в базата данни, над която старите съобщения ще бъдат запитвани от нормални SQLite заявки. И под тази точка искаме да зададем SQLBrite, който ще ни донесе свежи съобщения, добавени към базата данни.
  2. Всяка част трябва да попълни съответния ArrayList. И два arrayLists трябва да се комбинират в един адаптер.

Моят въпрос възможно ли е да се направи? Ако да, как можем да комбинираме и обработваме два динамични ArrayLists в един адаптер?

Редактиране 1 1. Трябва да запазя позицията на превъртане на чата по време на нулиране и без трептене по време на актуализацията на ArrayLists.


person Rafael    schedule 22.04.2015    source източник
comment
Adopter ще приеме само един масив, трябва да обедините двата масива. Трябва да намерите решение за динамично актуализиране на списъци и повторно обединяване   -  person    schedule 22.04.2015
comment
защо не използвате MergeCursor?   -  person pskink    schedule 22.04.2015


Отговори (4)


1. С помощта на генерични продукти можете да обработвате два arraylist с един ArrayList.

Например в адаптер:

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

С оглед

 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. Ако използвате същия модел, можете да зададете тип (enum) и за двата arraylist и по време на показване можете да проверите това.

3. В противен случай можете първо да добавите стари данни в arraylist и след това да използвате колекцията addAll() да добавите втория последен списък със съобщения в него. тогава

  adapter.notifyDataSetChanged() 

ще зададе първо старо съобщение, след което ще зададе най-новото съобщение във вашия списък

Допълнително пояснение: При втория подход, ако имате различни модели за двата списъка с масиви, тогава съдържайте enum и в двата модела като средство за получаване на сетер.

  public enum eType{
   FIRST_LIST_TYPE,SECOND_LIST_TYPE
   }

По време на извличане на данни от различен набор от DB Въведете модел. напр

  public class model{
   private enum eType;

// друга стойност за получаване на сетер от вашата DB /** * Извличане на сетер: */

   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.
person Deepanker Chaudhary    schedule 22.04.2015
comment
@Deepanker Бихте ли обяснили малко повече за второто решение с кодов фрагмент - person Praveen; 02.09.2016
comment
@Praveen Добавих повече разяснения за 2-ри подход. Но третият подход е най-добрият, няма нужда да проверявате който и да е тип, само addAll ще добави всички данни. - person Deepanker Chaudhary; 02.09.2016
comment
Благодаря @DeepankerChaudhary. По-рано използвах метода за добавяне на всички. В момента използвам 2-ри подход, използвайки Boolean за разграничаване на типа списък, но по този начин приложението няма да бъде мащабирано, ако има повече типове списък. Затова исках да проуча начини за използване на enum, различни от използването на генерични. - person Praveen; 06.09.2016

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
       } 
 }
person amodkanthe    schedule 22.04.2015

Можете да подадете само един списък в accepter, което означава, че трябва да обедините и двата масива. За да обедините двата масива. те трябва да са от един и същи тип, т.е. масив от същия потребителски обект.

Ако масивите се актуализират динамично, обединете масивите отново, тъй като техните данни се променят, и извиквайте notifyDataSetChanged() всеки път, за да отразите промените в списъка

person Community    schedule 22.04.2015

Толкова много гняв за C въпроси на SO хаха. Изплаши ги в Java!
person Moinkhan    schedule 22.04.2015
comment
не забравяйте да напишете notifyDataSetChanged() - person Moinkhan; 22.04.2015