Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在notifyDataSetChanged()上设置ListView项的动画_Android_Listview_Animation_Android Listview - Fatal编程技术网

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

问题的关键是如何为不同的更改设置不同的动画。根据链接的答案,我认为您可以根据索引将不同的动画应用于不同的行项目@受难者