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

- мы хотим установить точку в базе данных, выше которой старые сообщения будут запрашиваться обычными запросами SQLite. И ниже этой точки мы хотим установить SQLBrite, который принесет нам свежие сообщения добавляются в базу данных.
- каждая часть должна заполнить соответствующие коллекции. И два arraylist'а должны быть объединены в одном адаптере.
Мой вопрос Можно ли это сделать? Если да, то как мы можем объединить и обработать два динамических ArrayLists в одном адаптере?
Edit 1
1. Мне нужно сохранить положение прокрутки чата во время сброса, и никаких мерцаний во время обновления ArrayLists.
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... } }
- Если вы используете одну и ту же модель, вы можете задать тип (перечисление) для обоих 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