【问题标题】:Android ListView adapter with two ArrayLists带有两个 ArrayLists 的 Android ListView 适配器
【发布时间】:2015-04-22 05:43:25
【问题描述】:

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

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

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

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

【问题讨论】:

  • Adopter 将只接受一个数组,您必须合并两个数组。您必须找到动态更新列表并重新合并的解决方案
  • 为什么不使用 MergeCursor?

标签: android listview adapter sqlbrite


【解决方案1】:

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中添加旧数据然后使用collection addAll() 在其中添加第二条最新消息列表。那么

  adapter.notifyDataSetChanged() 

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

更多说明: 在第二种方法中,如果您对两个数组列表都有不同的模型,则在两个模型中都包含一个枚举作为 setter getter。

  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.

【讨论】:

  • @Deepanker 你能用代码 sn-p 解释一下第二个解决方案吗
  • @Praveen 我为第二种方法添加了更多说明。但是第三种方法最好不需要检查任何类型,只有 addAll 会添加所有数据。
  • 谢谢@DeepankerChaudhary。我之前使用过 add all 方法。目前我正在使用第二种方法使用布尔来区分列表类型,但是这样,如果有更多列表类型,应用程序将不会缩放。所以想探索使用枚举而不是使用泛型的方法。
【解决方案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
       } 
 }

【讨论】:

    【解决方案3】:

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

    如果数组是动态更新的,那么随着数据的变化再次合并数组,每次调用notifyDataSetChanged(),以反映listview的变化

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 别忘了写 notifyDataSetChanged()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 2013-09-08
      相关资源
      最近更新 更多