带有两个ArrayLists的Android ListView适配器

时间:2015-04-22 05:43:25

标签: android listview adapter sqlbrite

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

  1. 我们希望在数据库中设置点,正常的SQLite查询将查询旧消息。在这一点之下,我们想要设置SQLBrite,这将为我们带来添加到数据库的新鲜消息。
  2. 每个部分都应填充其对应的ArrayList。并且应该将两个arrayLists组合在一个适配器中。
  3. 我的问题是可以吗?如果是,我们如何在单个适配器中组合和处理两个动态ArrayLists?

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

4 个答案:

答案 0 :(得分:5)

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设置类型(枚举) &安培;在显示时间你可以检查。
  2. 3.否则,您可以先在arraylist&amp;中添加旧数据。然后使用集合          addAll()在其中添加第二个最新消息列表。那么

      adapter.notifyDataSetChanged() 
    

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

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

      public enum eType{
       FIRST_LIST_TYPE,SECOND_LIST_TYPE
       }
    

    在获取来自不同DB的数据集期间输入模型。 e.g

      public class model{
       private enum eType;
    

    //来自数据库的其他setter getter值 / ** * 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.
    

答案 1 :(得分:2)

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

答案 2 :(得分:1)

是的,你可以做到。但是这两个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);

答案 3 :(得分:1)

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

如果数组是动态更新的,那么在数据更改时再次合并数组,并每次调用notifyDataSetChanged(),以反映listview中的更改