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

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

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

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

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

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

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

      adapter.notifyDataSetChanged() 

    Установит первое старое сообщение, а затем установит последнее сообщение в вашем списке

    Более подробная информация: во втором подходе, если у вас есть разные модели для обоих arraylist, тогда в enem в качестве модели getter есть перечисление.

      public enum eType{ FIRST_LIST_TYPE,SECOND_LIST_TYPE } 

    Во время извлечения данных из другого набора данных DB в модели. например

      public class model{ private enum eType; 

    // другое значение getter получателя из вашего DB / ** * Setter getter: * /

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

    Во время выборки данных введите тип eg

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

    Вы можете передать только один список в усыновителе, что означает, что вы должны объединить оба массива. Чтобы объединить оба массива. Они должны быть одного типа, т. Е. Массива того же пользовательского объекта.

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

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

     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);