2016-08-23 1 views
0

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

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

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

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

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

+1

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

+0

Предпочтительным методом для функции «ListView» является «RecylcerView». Ответ здесь содержит сведения об управлении списком, который управляет измененными пользователем данными в списке, реализованном с использованием предпочтительного метода: http://stackoverflow.com/a/40568269/897007 – Dale

ответ

0

Override метод 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; 
    } 
+0

Спасибо за предложение, но я не уверен, как работайте с тех пор, как я в настоящее время получаю свой «ListView», вызывая 'getListView()' из моего класса, который расширяет «ListActivity». Это оставляет мне вопрос о том, как я могу переопределить «ListView», который предоставляется «ListActivity». – Dale

+1

Вы уверены, что вам нужно использовать ListActivity? Просто добавьте AppCompatActivity и добавьте ListView в контент. – mayosk

+1

@Dale: переопределить 'getView()' в классе адаптера не в подклассе 'ListView' – Kushal

 Смежные вопросы

  • Нет связанных вопросов^_^