当我的数据库数据发生变化时,我想用ListView
向我的SimpleCursorAdapter
添加一些动画。
我在SimpleCursorAdapter
使用LoaderManager
我尝试在getView
方法
@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);
之前在旧游标和新游标之间进行更改。可以在交换之前标记项目(删除,更新,新建)并删除动画,并在{ {1}}。
我该如何解决这个问题?
答案 0 :(得分:1)
答案 1 :(得分:1)
不,至少我没有发现Android可以向我报告是否有新项目或已删除项目。我做了类似的事情,ListView的项目激活了他们的新职位,我不得不自己跟踪他们的位置。
对于您的用例,在从数据库中删除行之前放置淡入淡出动画可能更容易。因此,无论您在代码中删除数据库中的行并触发刷新,您都可以在项目上执行淡入淡出动画,并在动画完成后删除行并触发刷新。
<强>更新强>
嗯,我看得太快了。您的示例不是对已删除项目的淡出,而是对新项目的淡入淡出。您必须自己在适配器中跟踪项目ID。只有当您显示的项目数量有限时,此方法才有效,因为以前的项目ID列表必须存储在内存中。如果你不能确定列表永远不会太大,那么你必须找到一种方法将“新颖性”信息添加到光标本身。
让我看看我是否可以做些什么。稍后回来......
更新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);
}
}
答案 2 :(得分:0)
也许RecyclerView有帮助。试试notifyItemChanged