0

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

这是我的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; 
} 

}

回答

0

在2.3及更早版本的Android列表视图元素的可见内容进行索引。你需要使用listView.getFirstVisible()来获得一个特定的元素

0

这实际上是因为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); 
+0

如果行处理顺序中没有保证如何排序可以帮助我? – Johnny

+0

排序将基本上将一个较高的布局添加到行的渲染操作。它会知道它必须渲染,但也要指望你已经定义了'.sort()'方法,并且这个方法会存活下来,所以你的'ListView'将被排序。 – nKn

+0

我对我的收藏进行排序,但有同样的问题。集合现在进行排序我从日志中验证,但在ListView中的顺序不正确。在调用notifyDataSetChanged之前,我是否错过了我排序集合的东西? – Johnny