带有两个ArrayList的Android ListView适配器

带有两个ArrayList的Android ListView适配器,android,listview,adapter,sqlbrite,Android,Listview,Adapter,Sqlbrite,在我们的聊天应用程序中,我们希望使用酷炫的新库来更新数据库更改时的聊天。由于我们的聊天室有无休止的滚动,并且聊天室可能有非常大的消息列表,所以我们希望将提供给聊天室ListView适配器的ArrayList拆分为两个列表。检查图形以了解想法。 我们希望在数据库中设置一个点,在该点之上,旧消息将由普通的SQLite查询查询。在这一点之下,我们需要设置SQLBrite,这将为我们提供添加到数据库中的新消息 每个零件都应填充其相应的ArrayList。两个ArrayList应该组合在一个适配器中 我

在我们的聊天应用程序中,我们希望使用酷炫的新库来更新数据库更改时的聊天。由于我们的聊天室有无休止的滚动,并且聊天室可能有非常大的消息列表,所以我们希望将提供给聊天室ListView适配器的ArrayList拆分为两个列表。检查图形以了解想法。

  • 我们希望在数据库中设置一个点,在该点之上,旧消息将由普通的SQLite查询查询。在这一点之下,我们需要设置SQLBrite,这将为我们提供添加到数据库中的新消息
  • 每个零件都应填充其相应的ArrayList。两个ArrayList应该组合在一个适配器中
  • 我的问题是有可能吗?如果是,我们如何在单个适配器中组合和处理两个动态ArrayList

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

    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
           } 
     }
    
    public View getView(int位置、视图转换视图、视图组视图组){
    如果(位置<列表1.大小){
    Object Object=list1.get(位置);
    //在此处编写与列表1相关的充气视图代码
    }
    否则{
    Object Object=list2.get(position-list1.size());
    //在此处编写与列表2相关的原始充气代码
    } 
    }
    
    1.借助泛型,您可以用单个arraylist处理两个arraylist

    例如,在适配器中:

    setListData(ArrayList<T> pListData)
    {
        mListData=pListData;
    }
    
  • 如果使用相同的模型,则可以为两个arraylist设置类型(枚举) &在放映期间,您可以检查
  • 3.否则,您可以先在arraylist中添加旧数据,然后使用collection addAll()在其中添加第二个最新消息列表。然后

      adapter.notifyDataSetChanged() 
    
    将设置第一条旧消息,然后将设置列表中的最新消息

    更多澄清: 在第二种方法中,若两个arraylist有不同的模型,那个么在两个模型中都包含一个枚举作为setter-getter

      public enum eType{
       FIRST_LIST_TYPE,SECOND_LIST_TYPE
       }
    
    从模型中不同数据库的集合类型获取数据期间。 e、 g

    //数据库中的其他setter-getter值 /** *塞特-盖特: */

    在获取数据集类型时,例如

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

    是的,你能做到。但是两个arraylist都应该有共同的数据格式。 例如。。 在适配器中,您可以使方法

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

    您只能在adopter中传递一个列表,这意味着您必须合并两个数组。 为了合并两个数组。它们必须是相同的类型,即相同自定义对象的数组


    如果数组是动态更新的,那么当数组的数据发生变化时,再次合并数组,并每次调用
    notifyDataSetChanged()
    以反映listview中的变化采纳者将只接受一个数组,您必须合并两个数组。您必须找到一个动态更新列表和重新编码的解决方案为什么不使用MergeCursor?别忘了编写notifyDataSetChanged()@Deepanker您能用代码解释一下第二个解决方案吗snippet@Praveen我为第二种方法添加了更多说明。但第三种方法是最好的,不需要检查任何类型,只有addAll会添加所有数据。谢谢@DeepankerChaudhary。我以前使用过addall方法。目前,我使用第二种方法使用布尔值来区分列表类型,但这样,若有更多的列表类型,应用程序将不会被缩放。所以我想探索使用枚举而不是泛型的方法。
       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.
    
    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);