2014-01-07 2 views
0

, поэтому у меня есть эта огромная проблема с применением зачеркивания элемента ListView при заполнении его из списка моих объектов.Как зачеркнуть элемент ListView при заполнении ListView

private void setListItems() { 
     DatabaseHandler db = new DatabaseHandler(this); 
     List<ToDoTask> taskList = db.getAllTasks(); 

     for (ToDoTask tt : taskList) { 
      this.listAdapter.add(tt.getName()); 
     } 

     this.listAdapter.notifyDataSetChanged(); 
    } 

Эта часть кода заполняет мой ListView. Теперь я хочу, чтобы добавить зачеркивание к пункту, если

tt.getActive() == 0 

Я не знаю, как я могу получить элемент TextView из моей ListView. Я пробовал в своем цикле:

TextView textView = (TextView) this.listView.getChildAt(this.listView.getCount() -1); 

но приложение аварийно завершает работу. Единственное решение, которое не врезаться мое приложение было:

TextView textView = this.listAdapter.getView(this.listView.getCount() -1, null, null) 

но это на самом деле не изменить что-либо в ListView. Я думаю, что это не относится к самому объекту. Вот код, который инициализирует свои переменные:

this.listView = (ListView) findViewById(R.id.listViewItem); 
    this.listItems = new ArrayList<String>(); 
    this.listAdapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, this.listItems); 
    this.listView.setAdapter(this.listAdapter); 

ответ

2

Списочное не отвечает за инстанцировании или изменение базового состояния взглядов, которые он содержит. Это задача адаптера. Когда вы прокручиваете ListView, он вызывает метод адаптера getView(), и адаптер передает ему строку (возможно, переработанный вид из строк, прокручиваемых за кадром).

Внутри метода getView() адаптер должен проконсультироваться с базовым набором данных и модифицировать строку по мере необходимости, что будет включать в себя вычеркивание текста или настройку любых визуальных свойств содержимого строки.

+0

@ user3170934: И, в отношении элемента зачеркивания, вам нужно будет обезопасить себя с помощью 'StrikethroughSpan'. – CommonsWare

+0

@Collin FLynn: Если я правильно вас понимаю, мне нужно получить элемент TextView, введя 'TextView tv = this.listAdapter.getView (this.listView.getCount() - 1, null, this.listView)'. Да, это дает мне объект TextView, но когда я устанавливаю флаги для этого парня, он не влияет на listView и listAdapter. Должен ли я сказать listAdapter, чтобы как-то обновить представление в заданной позиции? – user3170934

+0

@ user3170934 Да, вы должны сказать адаптеру обновить представление. Один из способов - использовать шаблон «ViewHolder» в ваших интересах. Попросите адаптер сохранить позицию int внутри каждого «ViewHolder» для каждой строки. Напишите способ в своем адаптере, который принимает строку (независимо от вашей строки - некоторый вид) в качестве параметра. Из строки возьмите держатель вида и проверьте позицию int, чтобы увидеть, какой элемент находится в наборе данных. Вы должны сохранить это состояние как часть набора данных внутри адаптера, а внутри метода getView - проверить состояние представления, на которое вас попросили доставить, а затем построить его. –