排序项后更新可扩展ListView

时间:2012-02-14 12:39:47

标签: android sorting expandablelistview

概述:

  • 我有一个可扩展列表视图,显示ToDoElement类型的项目。
  • 每个ToDoElement项目都有一个字符串用于Group-Element,1-3个字符串用于子元素
  • 我的自定义列表适配器expListAdapter使用方法createGroupList()createChildList()获取有关group-and item-items的信息。
  • 在方法createChildList()中,我检查ToDoElement中子项的字符串数,并为适配器创建子项。
  • 最后,我可以通过比较组项的字符串来对列表进行排序。

所有这一切都很好,但这是我的问题:

  • 在列表视图中的项目正确排序后,子项目的数量是错误的。
  • 那是因为我的列表适配器不知道子项的数量已经改变。因此,某些子项不会显示,而其他子项只是空的,因为没有数据。

我的建议:

我知道必须以某种方式从我的适配器再次调用方法createGroupList()createChildList(),但我不知道该怎么做。我已经尝试expListAdapter.notifyDataSetInvalidated(),因为有人告诉我这种方法会再次调用createGroupList()createChildList(),但是不起作用。

代码片段:

我的列表适配器的定义:

expListAdapter = new MyListAdapter(this, createGroupList(), createGroupList());
setListAdapter( expListAdapter );

createGroupList()和createChildList():

    private List createGroupList() {    
      ArrayList result = new ArrayList();
      for (int i=0; i < Liste.AnzahlElemente(); i++) {    //
        result.add(Liste.getSize(i).getGroupString());
      }
      return result;
    }

    private List createChildList() {
        ArrayList result = new ArrayList();
        for(int i=0; i < Liste.getSize(); i++) {
            ArrayList secList = new ArrayList();
            for( int n = 1 ; n <= 3 ; n++ ) {
                if (Liste.getElement(i).getChildString(n).length() != 0){
                    secList.add( "- " + Liste.getElement(i).getChildString(n));
                }
            }
            result.add( secList );
        }
        return result;
}

对列表进行排序:
Liste是一个ToDoListe对象,用于管理数组列表中的ToDoElement

Collections.sort(Liste.getListe(), new NameComparator());

expListAdapter.notifyDataSetInvalidated();

//expListAdapter.notifyDataSetChanged(); //same effect as notifyDataSetInvalided

我的NameComparator:

public class NameComparator implements Comparator<ToDoElement>{

     public int compare(ToDoElement item1, ToDoElement item2) {
           return item1.getGroupString().compareTo(item2.getGroupString());
     }
}


非常感谢你的帮助!!

2 个答案:

答案 0 :(得分:2)

我解决了自己的问题!

我为自定义列表适配器编写了一个Update方法。

看起来像这样:

public class MyListAdapter extends BaseExpandableListAdapter{

     private ArrayList<String> ueberschriften;
     private ArrayList<ArrayList<String>> stichpunkte;

     public MyListAdapter(Context context, List _ueberschriften, List _stichpunkte) { 

          this.ueberschriften = (ArrayList)_ueberschriften;
          this.stichpunkte = (ArrayList)_stichpunkte;

          inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

     // [...] some other methods

     public void update(List _GroupStrings, List _ChildStrings) {
          GroupStrings = (ArrayList<String>) _GroupStrings;
          ChildStrings = (ArrayList<ArrayList<String>>) _ChildStrings;
     }
}

在我的活动中对列表进行排序如下所示:

Collections.sort(Liste.getListe(), new NameComparator());

expListAdapter.update(createGroupList(), createChildList());

expListAdapter.notifyDataSetChanged();


现在子项的数量也正确更新!
干杯!

答案 1 :(得分:0)

适配器中的列表和显示的列表是单独的列表。

如果适配器填充了新数据或重新安排了数据,则需要通过 notifyDataSetChanged()通知视图 - 这将触发重新绘制视图。

只有在您的数据不再可用时才应调用

notifyDataSetInvalidate()

如下所述:  Android ListView Adapter notifyDataSetInvalidated() vs notifyDataSetChanged()