Android: обновление элемента в ListView, который выживает при прокрутке

Учитывая ListActivity с ListView и требование изменить элемент на основе пользовательского ввода, как сделать изменение, чтобы оно выдерживало прокрутку?

В настоящее время приложение использует ResourceCursorAdapter населенный Cursor из базы данных. Когда пользователь долго щелкает элемент, ImageView на этот элемент переключается между View.VISIBLE а также View.GONE, Кроме того, флаг в базе данных, поддерживающей состояние представления, управляется.

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

Мое текущее решение (которое я считаю неправильным) состоит в том, чтобы сохранить позицию прокрутки, обновить весь список из базы данных, а затем снова поместить в нужное место.

Я предполагаю, что есть какой-то способ сказать какой-то Androidy-вещи, чтобы поместить новое состояние видимости в его кеш, но я не могу его найти. я пробовал setScrollingCacheEnabled(false)и некоторые другие кеш ложные, но ни один из них, казалось, не имел значения. Я пытался выяснить, как заставить Android понять, что он "грязный", но все, что я нашел, это спросить, если он isDirty(), Я тоже пробовал ResourceCursorAdapter.notifyDataSetChanged()и это сделало setVisibility() вызов неэффективен по видимости. Я тоже пробовал invalidate() а также invalidateViews() в разных местах. Это может быть один из них, если он будет применен к правильному объекту в правильной последовательности (до или после изменения видимости).

1 ответ

Переопределите метод getView в ListView и попробуйте использовать его следующим образом:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder; // view lookup cache stored in tag
        if (convertView == null) {
            viewHolder = new ViewHolder();
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.your.layout, parent, false);
            viewHolder.img = (TextView) convertView.findViewById(R.id.img);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        if (condition) {
            viewHolder.img.setVisibility(VIEW.VISIBLE);
        else { 
           viewHolder.img.setVisibility(VIEW.GONE);
        }

        // Return the completed view to render on screen
        return convertView;
    }
Другие вопросы по тегам