带有两个ArrayLists的Android ListView适配器

Raf*_*ael 5 android listview adapter sqlbrite

在我们的聊天应用程序中,我们希望使用很酷的新库SQLBrite来更新数据库更改的聊天.由于我们的聊天有无尽的滚动,聊天室可以有非常大的消息列表,我们希望将提供给Chat ListView适配器的ArrayList拆分为两个列表.检查图形的想法. 在此输入图像描述

  1. 我们想在数据库中设置一个点,通过正常的SQLite查询查询旧消息.在这一点之下,我们想要设置SQLBrite,这将为我们带来添加到数据库的新鲜消息.
  2. 每个部分都应填充其对应的ArrayList.两个arrayLists应该组合在一个适配器中.

我的问题是可以吗?如果是,我们如何在单个适配器中组合和处理两个动态ArrayLists?

编辑1 1.我需要在重置期间保持聊天滚动位置,并且在ArrayLists更新期间不会闪烁.

Dee*_*ary 5

1.借助泛型,您可以使用单个ArrayList处理两个arraylist。

例如在适配器中:

setListData(ArrayList<T> pListData)
{
    mListData=pListData;
}
Run Code Online (Sandbox Code Playgroud)

视野中

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

      T commonModel= getItem(position);
    if(T instanceof ArrayListOneModel){
     ArrayListOneModel model1=(ArrayListOneModel)T;
    do stuf for first arraylit...
      }
 }
Run Code Online (Sandbox Code Playgroud)
  1. 如果您使用相同的模型,则可以为arraylist设置类型(枚举),并且在显示时间期间可以检查该类型。

3.否则,您可以先在arraylist中添加旧数据,然后使用collection addAll()在其中添加第二个最新消息列表。然后

  adapter.notifyDataSetChanged() 
Run Code Online (Sandbox Code Playgroud)

将设置第一条旧消息,然后设置列表中的最新消息

进一步说明: 在第二种方法中,如果两个arraylist都有不同的模型,则在两个模型中都包含一个枚举作为setter获取器。

  public enum eType{
   FIRST_LIST_TYPE,SECOND_LIST_TYPE
   }
Run Code Online (Sandbox Code Playgroud)

从不同DB的集合中获取数据期间,键入Model。例如

  public class model{
   private enum eType;
Run Code Online (Sandbox Code Playgroud)

//您数据库中的其他setter getter值/ ** * Setter getter:* /

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

  }
Run Code Online (Sandbox Code Playgroud)

在获取数据集时,键入例如

 Model model = new Model();
 model.seteType(eType.FIRST_LIST_TYPE) ;
  //same for 2nd db.
 & simply check type inside getView() according to your requirement.
Run Code Online (Sandbox Code Playgroud)