ListView getChildAt () остается нулевым, НО, если в onclick это работает - PullRequest
3 голосов
/ 20 января 2012

У меня есть ListView, который заполнен элементами ArrayAdapter.Теперь я хочу вычеркнуть их при щелчке, а также проверить в начале, если они уже пробиты (вызов внешнего API и т. Д.).Но он работает только в onItemClickListener, а метод выше - нет.Чтобы понять это лучше, вот код:

public void machListe() { 
   listViewArrayAdapter = new ArrayAdapter(getApplicationContext(),R.layout.task_item, ti);
   taskListe.setAdapter(listViewArrayAdapter);
   TextView ab=(TextView) taskListe.getChildAt(0);

Так что, если я отлаживаю сейчас, я вижу, что ab - ноль.

taskListe.setOnItemClickListener(new OnItemClickListener() { 

   public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3) {

     TextView ab=(TextView) taskListe.getChildAt(0);

Если я отлаживаю здесь, ab - не ноль.

Ответы [ 3 ]

3 голосов
/ 20 января 2012

Вы пытаетесь определить состояние задач в своих представлениях.

Вы должны попытаться разделить Model и View на этом этапе. Создайте объект модели, содержащий одну задачу, затем расширьте ArrayAdapter и перезаписайте getView . В getView вы получаете правильную задачу из списка задач. Создайте текстовое представление для задачи, и если задача помечена как выполненная в вашей модели, вы отменяете текст.

Если вы попытаетесь изменить представления в списке после их создания, вам придется делать это каждый раз, когда список прекращает прокручивать, потому что список будет содержать только дочерние представления для элементов, отображаемых на экране, другие представления создан во время прокрутки для экономии памяти.

Единственное правильное место для изменения элемента списка - метод getView соответствующего адаптера.

Для получения дополнительной информации ознакомьтесь с ListsView Tutorial на vogella.de.

2 голосов
/ 20 января 2012

Настройка адаптера вызовет requestLayout, но фактическая раскладка еще не сделана.
Таким образом, у taskListe не будет дочерних представлений, когда вы вызываете getChildAt (0) сразу после вызова setAdapter

0 голосов
/ 20 марта 2013

Вот код, а 2 - значение индекса

    View view=adapter.getView(2, null, null);
    TextView textView = (TextView) view.findViewById(R.id.textView1);
    String value = textView.getText().toString();
...