2016-10-10 3 views
-1

Я пытаюсь получить все значения TextView и EditText внутри ListView, но у меня есть странная проблема. Вот мой пример кода, я удалил EditText держать его просто:Как получить значение всего textView внутри Listview?

lv = (ListView) findViewById(R.id.person_details_lv); 
     Integer x = lv.getAdapter().getCount(); 
     for (int i = 0; i < lv.getAdapter().getCount(); i++) { 
      View viewRow = lv.getChildAt(i); 
      //this next condition get the index of the view visible only 
     if (viewRow != null) { 
      TextView NameEditText = (TextView) viewRow.findViewById(R.id.detail_name); 
      Log.d("hello", "Anything detected onscreen:" + NameEditText.getText().toString() + "); 
     }} 

Вопрос заключается в том, что это только вернуть View видимую на экране. Тем не менее, getCount подсчитывает все. Как результаты, я получаю эту ошибку

java.lang.NullPointerException

Я добавил это условие: if (viewRow != null) удалить ошибку, но он продолжает показывать только вид видимый на экране. Когда я просматриваю listView, результаты также меняются. Я хочу сделать, чтобы значение TextViewe в ListView было видно на экране или нет.

+0

Извлеките значения из списка, который вы используете –

+1

Почему вы не получаете элементы из адаптера? –

+0

, пожалуйста, покажите, как вы настроили адаптер - есть ли список, содержащий все данные? – 0X0nosugar

ответ

1

Я думаю, вы должны реализовать этот метод:

public View getViewByPosition(int pos, ListView listView) { 
     final int firstListItemPosition = listView.getFirstVisiblePosition(); 
     final int lastListItemPosition = firstListItemPosition 
       + listView.getChildCount() - 1; 

     if (pos < firstListItemPosition || pos > lastListItemPosition) { 
      return listView.getAdapter().getView(pos, null, listView); 
     } else { 
      final int childIndex = pos - firstListItemPosition; 
      return listView.getChildAt(childIndex); 
     } 
    } 

И затем вызвать этот метод remplacing ваш:

View viewRow = lv.getChildAt(i); 

с:

viewRow= getViewByPosition(i, lv); 

И это все! вам не нужно менять остальных. Просто удалите это if (viewRow != null). Я надеюсь, что это помогает!

+0

Ничего себе! Спасибо! –

-1

Вам необходимо сохранить свой элемент списка в списке <>, который вы передали адаптеру. Вы должны сохранить значение EditText, когда вызывается OnTextChanged. Значение TextView уже доступно в вашем списке.

0

Не все виды в элементах listview имеют тип TextView, поэтому, когда вы бросаете их, некоторые из них равны нулю. (Представления каста, отличные от TextView, к TextView делают нулевой объект)

После кастинга просто проверьте, не имеет ли значение null TextView, если его null просто пропустить.

ДОБАВЬТЕ НУЛЬНОЕ СОСТОЯНИЕ ПОСЛЕ КАСТИНГА!