0

У меня есть странная проблема с ListView на Android 2.3. Приложение представляет собой простой список задач с помощью EditText и ListView. Каждый раз, когда вы пишете текст и нажимаете ENTER, текст добавляется в ListView. Проблема возникает, когда я добавляю третий элемент, заказываю в ListView mess (третий элемент становится первым). Я решаю эту проблему, поэтому каждый раз перехватываю данные в 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