Android ListView адаптер с двумя ArrayLists



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




  1. мы хотим установить точку в базе данных, выше которой старые сообщения будут запрашиваться обычными запросами SQLite. И ниже этой точки мы хотим установить SQLBrite, который принесет нам свежие сообщения добавляются в базу данных.

  2. каждая часть должна заполнить соответствующие коллекции. И два arraylist'а должны быть объединены в одном адаптере.


Мой вопрос Можно ли это сделать? Если да, то как мы можем объединить и обработать два динамических ArrayLists в одном адаптере?



Edit 1
1. Мне нужно сохранить положение прокрутки чата во время сброса, и никаких мерцаний во время обновления ArrayLists.

577   4  

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. Если вы используете одну и ту же модель, вы можете задать тип (перечисление) для обоих arraylist и во время показа вы можете это проверить.

3.В противном случае вы можете сначала добавить старые данные в arraylist , а затем использовать collection addAll () добавить в него 2-й список последних сообщений. тогда

  adapter.notifyDataSetChanged() 

Будет установлен первый старый сообщение затем установит последнее сообщение в вашем списке

Дополнительные Разъяснения: Во втором подходе, если у вас есть разные модели для обоих arraylist, то содержать перечисление в обеих моделях как сеттер геттер.

  public enum eType{
   FIRST_LIST_TYPE,SECOND_LIST_TYPE
   }

Во время выборки данных из разных типов наборов БД в модели. например

  public class model{
   private enum eType;

/ / другое значение setter getter из вашей БД /** * Сеттер геттер: * /

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

Вы можете передать только один список в adopter, что означает, что вы должны объединить оба массива. Для того, чтобы объединить оба массива. они должны быть одного типа, то есть массива одного и того же пользовательского объекта.

Если массивы обновляются динамически, то снова объединяйте массивы по мере изменения их данных и вызывайте notifyDataSetChanged() каждый раз, чтобы отразить изменения в listview

Да, вы можете это сделать. но оба arraylist должны иметь общий формат данных. например .. В адаптере вы можете сделать метод, как

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

Теперь у вас может быть два arraylist как

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

Таким образом, вы можете вызвать метод адаптера, который мы создали

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

Comments

    Ничего не найдено.