2014-11-11 3 views
6

Я хочу добавить некоторую анимацию в мой ListView с SimpleCursorAdapter при изменении данных в базе данных. Я использую SimpleCursorAdapter с LoaderManager Я пытался добавить анимацию в getView методеАнимация ListView items items notifyDataSetChanged()

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view=super.getView(position, convertView, parent); 
    //My animation(nineoldandroid) 
    ObjectAnimator.ofFloat(view,"alpha",0,1).setDuration(500).start(); 
    return view; 
} 

Но этот метод одушевляет все элементы, хотя некоторые элементы были одинаковыми перед обновлением. Есть ли у Android методы определения того, какие элементы нужно обновлять, удалять или добавлять?

Например, возможно, есть способы для получения изменений между старым и новым курсором перед вызовом myAdapter.swapCursor(newCursor); Можно было бы отметить элементы (удаленные, обновленные, новые) и сделать удаление анимации перед обкачкой и анимацией ither в getView. Как я могу решить эту проблему?

ответ

1

Есть много способов для достижения этой цели, вы можете попробовать ответы на этот вопрос:

How to Animate Addition or Removal of Android ListView Rows

1-ый ответ рабочие

+0

Вопрос заключается в том, как настроить различные анимации для разных изменений. –

+0

Основываясь на ответе на ссылку, я думаю, вы можете применить другую анимацию к различным элементам строки на основе индекса. @Sufferer – antonio081014

1

Нет, по крайней мере, я не нашел, что Android может сообщить мне, если есть новые или удаленные элементы. Я сделал что-то подобное, когда элементы ListView оживили их новые позиции, и я сам должен был отслеживать их позиции.

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

Update

Ммм, я прочитал слишком быстро. Ваш пример не является постепенным исчезновением удаленных элементов, а является затуханием новых элементов.

Вам придется отслеживать идентификаторы элементов самостоятельно в своем адаптере. Этот подход может работать только в том случае, если у вас есть ограниченное количество элементов для показа, потому что список предыдущих идентификаторов элементов должен быть сохранен в памяти. Если вы не можете быть уверены, что список никогда не слишком велик, вам нужно будет найти способ добавить информацию «новизны» к самому курсору.

Позвольте мне посмотреть, смогу ли я что-нибудь приготовить. Попозже ...

Update 2

Ниже SimpleCursorAdapter, который отслеживает вещи ID от предыдущего курсора. В getView() он запускает анимацию затухания, если запрашиваемый вид предназначен для элемента, который раньше не присутствовал.

private static class FadeInAdapter extends SimpleCursorAdapter { 

    private List<Long> previousItemIds = new ArrayList<Long>(); 

    private FadeInAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) { 
     super(context, layout, c, from, to, flags); 
    } 

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

     // check if this view is for an item that is new 
     long itemId = getItemId(position); 
     if (!previousItemIds.contains(itemId)) { 
      // do the fade-in animation 
      result.setAlpha(0); 
      result.animate().alpha(1).setDuration(500).start(); 
     } 

     return result; 
    } 

    @Override 
    public void changeCursor(Cursor cursor) { 
     Cursor oldCursor = getCursor(); 
     if (oldCursor != null) { 
      // store previous item IDs to check against for newness with the new cursor 
      final int idColumnIndex = oldCursor.getColumnIndexOrThrow(DatabaseContract._ID); 
      previousItemIds.clear(); 
      for (oldCursor.moveToFirst(); !oldCursor.isAfterLast(); oldCursor.moveToNext()) { 
       previousItemIds.add(oldCursor.getLong(idColumnIndex)); 
      } 
     } 

     super.changeCursor(cursor); 
    } 
} 
0

Возможно, RecyclerView помогает. Попробуйте notifyItemChanged