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;
}