更新自定义ArrayAdapter中的现有项目

时间:2015-02-18 11:17:28

标签: android android-listview

我有聊天应用程序,在listview中有两种类型的元素

message
message
message
  Header
message
message

在显示标题后的我的应用中,我需要在特定时间或事件后删除或隐藏它。 我知道我可以按位置获得这个项目。问题是我的listview动态地可以从双方增长。 在这种情况下我该怎么办? 您可以在此问题中查看我的自定义适配器:In Android how to prevent updating existing items on notifyDataSetChanged()

1 个答案:

答案 0 :(得分:1)

我会将一个Class扩展为另一个,并将ArrayAdapter作为父类。

在您的抽屉中,您可以使用

 if (position.get(pos) instanceOf MessageHeader) { } 
 else if (position.get(pos) instanceOf SimpleMessage) {}

你的班级可能看起来像那样:

 class Message {
    private String text;  
 }
 class SimpleMessage extends Message {}
 class HeaderMessage extends Message {}

并且您的ArrayAdapter接受消息

class MyCustomAdapter extends ArrayAdapter<Message> {}

如果您想添加或删除项目,可以使用以下方式执行此操作:

 private ArrayList<Message> messages = null;
 public myAdapter(List myList) { this.messages = (ArrayList)myList; }

 public void addItem(Message message) { messages.add(message); forceUpdate(); }
 public void removeItem(int position) {messages.remove(position); forceUpdate(); }
 private voice forceUpdate() { notifyDataSetInvalidated(); notifyDataSetChanged(); }

 private List<Integer> getItemPositionsWithHeader() {
      ArrayList<Integer> list = new ArrayList<>();
      for (int i = 0, j = messages.size(); i <= j; i++) {
          if (messages.get(i) instanceOf HeaderMessage) {
             list.add(i); 
          }
      }
     return list;
 }

private void removeAllHeaderItemsFromList() {
      for (Integer i : getItemPositionsWithHeader) {
          messages.remove(i);
      } 
     forceUpdate();
}