Пользовательский ListAdapter в Android не работает должным образом, особенно при фильтрации - PullRequest
0 голосов
/ 20 августа 2011

у меня есть список с изображениями в каждой строке. В некоторых строках я хочу отобразить эти изображения, а в некоторых я не хочу отображать их, поэтому я использую собственный ListAdapter:

XML списка строк содержит:

<ImageView
 android:id="@+id/image1"
 android:layout_height="fill_parent"
 android:src="@drawable/button1"
 android:visibility="invisible"/>

Итак, как вы видите по умолчанию, все изображения невидимы.

В пользовательском SimpleAdapter я проверяю свое состояние и, в зависимости от этого, устанавливаю изображение этой строки в видимый:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);

if(condition == true){

   ((ImageView) view.findViewById(R.id.image1)).setVisibility(View.VISIBLE);
}

return view;

}

Так что я делаю это так с 2 ImageViews и 3 TextViews в каждой строке. ImageViews по умолчанию невидимы и становятся видимыми в зависимости от условия, как показано выше. TextVoews имеют черный цвет и получают другой цвет текста на основе другого условия.

Моя проблема в том, что это хорошо работает для небольших списков, таких как 1-5 элементов или около того, но когда список становится длиннее, он работает не так, как ожидалось. Результат иногда просто неправильный, и когда я перезагружаю представление списка, основанное на тех же данных, я каждый раз вижу другой результат. Изображения установлены неправильно или цвета текста установлены неправильно.

Вторая проблема заключается в том, что это становится совершенно и определенно неверным, когда я применяю фильтр к адаптеру. У меня есть поле EditText, и я хочу применить фильтр при каждом изменении этого EditText, поэтому у меня есть TextChangedListener для этого EditText:

edittext1.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {}

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

        @Override
        public void afterTextChanged(Editable s) {

            adapter.getFilter().filter(s);
        }
    });

С того момента, как я установил фокус на этот EditText, весь просмотр списка полностью меняется, и кажется, что форматирование на основе условий теперь не только «иногда неправильно», но теперь «совершенно без какой-либо логики».

Так правильно ли я создаю свои строки и использую адаптер? Почему это не работает должным образом, и почему это сходит с ума, когда я начинаю использовать фильтр?

Большое спасибо за вашу помощь в Advane.

Ответы [ 3 ]

1 голос
/ 20 августа 2011

Виды адаптера перерабатываются, поэтому вам необходимо учитывать все пути, например:

if(condition == true){

   ((ImageView) view.findViewById(R.id.image1)).setVisibility(View.VISIBLE);
} else {
   ((ImageView) view.findViewById(R.id.image1)).setVisibility(View.INVISIBLE);
}

Таким образом, ImageView будет скрыто, когда условие ложно.

НетПодсказка о вашей проблеме с фильтром, я догадываюсь, что она связана с той же проблемой, что и выше.

0 голосов
/ 20 августа 2011

Итак, я наконец изменил этот SimpleAdapter, который у меня был, на ArrayAdapter и не использовал метод Filter по умолчанию, но реализовал метод, который фильтрует ArrayList и устанавливает фильтрованный ArrayList в качестве списка адаптеров.Теперь это работает.С помощью SimpleAdapter изображения не обновлялись после фильтрации, а с отфильтрованным списком я не мог обновить представления.Работает сейчас.

0 голосов
/ 20 августа 2011

Для первой задачи:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if(convertView == null) {
        convertView = mInflater.inflate(R.layout.my_list_row, null);

        if(condition == true)
            ((ImageView) convertView.findViewById(R.id.image1)).setVisibility(View.VISIBLE);
        else
            ((ImageView) convertView.findViewById(R.id.image1)).setVisibility(View.INVISIBLE);
    }

    return convertView; 
}

Что касается фильтра, что вы пытаетесь сделать? Возможно, вы захотите проверить inputTypes:

Http: //developer.android.com/reference/android/widget/TextView.html#attr_android: inputType

...