Android 在notifyDataSetChanged()上设置ListView项的动画
当我的数据库数据发生变化时,我想用Android 在notifyDataSetChanged()上设置ListView项的动画,android,listview,animation,android-listview,Android,Listview,Animation,Android Listview,当我的数据库数据发生变化时,我想用SimpleCursorAdapter向我的ListView添加一些动画。 我正在使用SimpleCursorAdapter和LoaderManager 我试图在getView方法中添加动画 @Override public View getView(int position, View convertView, ViewGroup parent) { View view=super.getView(position, convertView, pare
SimpleCursorAdapter
向我的ListView
添加一些动画。
我正在使用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)之前,可能有一些方法可以获取新旧游标之间的更改代码>可以标记项目(已删除、已更新、已新建),并在交换之前删除动画,然后在getView
中删除动画。
如何解决此问题?实现此目的的方法有很多,您可以尝试以下问题的答案:
第一个答案是有效的不,至少我没有发现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);
}
}
私有静态类FadeInAdapter扩展了SimpleCorsAdapter{
private List previousItemIds=new ArrayList();
专用FadeInAdapter(上下文上下文、int布局、光标c、字符串[]从、int[]到、int标志){
super(上下文、布局、c、from、to、标志);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
查看结果=super.getView(位置、转换视图、父级);
//检查此视图是否用于新项目
long itemId=getItemId(位置);
如果(!PreviousItemId.contains(itemId)){
//做淡入动画吗
结果:setAlpha(0);
result.animate().alpha(1).setDuration(500).start();
}
返回结果;
}
@凌驾
公共void changeCursor(游标){
游标oldCursor=getCursor();
if(oldCursor!=null){
//存储以前的项目ID,以使用新光标检查其新性
final int-idColumnIndex=oldCursor.getColumnIndexOrThrow(DatabaseContract.\u-ID);
previousItemId.clear();
对于(oldCursor.moveToFirst();!oldCursor.isAfterLast();oldCursor.moveToNext()){
add(oldCursor.getLong(idColumnIndex));
}
}
super.changeCursor(游标);
}
}
也许回收视图有帮助。尝试notifyItemChanged问题的关键是如何为不同的更改设置不同的动画。根据链接的答案,我认为您可以根据索引将不同的动画应用于不同的行项目@受难者