ListView的奇怪行为

时间:2014-02-14 21:02:42

标签: android android-listview android-adapter android-adapterview

我在Android 2.3上有ListView的奇怪问题。应用程序是EditText和ListView的简单待办事项列表。每次写文本并按ENTER键时,文本都会添加到ListView中。当我添加第3个元素时,问题发生,ListView陷入混乱(第3个元素变成第1个)。我解决了这个问题所以我每次都在getView中重新绑定数据但是在这种情况下我失去了ViewHolder模式优化。在4.0我没有相同的代码问题:)。有谁知道这种行为的原因是什么?

这是我的getView方法。

public View getView(int position, View convertView, ViewGroup parent) {

    final ViewHolder view;
    if(convertView == null) {

        convertView = ((LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.todo_single_row, parent, false);

        view = new ViewHolder();
        view.text = (TextView)convertView.findViewById(R.id.tvToDoText);
        view.date = (TextView)convertView.findViewById(R.id.tvToDoDate);

        convertView.setTag(view);
    }
    else
    {
        view = (ViewHolder)convertView.getTag();
    }

    view.text.setText(ToDoList.getInstance().getToDoList().get(position).getText());
    view.date.setText(ToDoList.getInstance().getToDoList().get(position).getDate().toString());

    return convertView;
}

我也尝试对我的适配器进行排序但没有帮助:(。

Comparator<Item> comparator = new Comparator<Item>() {
         public int compare(final Item item1, final Item item2) {
                return item1.getText().compareToIgnoreCase(item2.getText());
              };
    };

public class Item {
private String text;
private Date date;

public Item(String text) {

    this.text = text;
    this.date = new Date(java.lang.System.currentTimeMillis());
}

public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

public Date getDate() {
    return date;
}

public void setDate(Date date) {
    this.date = date;
}

}

2 个答案:

答案 0 :(得分:1)

2.3及更早版本的Android列表视图元素由可见内容编制索引。您需要使用listView.getFirstVisible()来获取特定元素。

答案 1 :(得分:1)

这实际上是因为通常getView()按照Android确定的顺序处理行。许多人认为这是按顺序调用的,而不是,它是在一个建立Adapter的订单中调用的。

但是,您可以覆盖此行为。在这种情况下,您只需声明Comparator即可。例如,如果行的内容是字符串,则这将是一种方式:

Comparator alphabeticalOrder = new Comparator<String>() {
  public int compare(final String str1, final String str2) {
    return str1.compareToIgnoreCase(str2);
  };
};

之后,您只需将其设置在Adapter

adapter.sort(alphabeticalOrder);