在notifyDataSetChanged()上设置动画ListView项

时间:2014-11-11 08:27:17

标签: android listview animation android-listview

当我的数据库数据发生变化时,我想用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}}。 我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

有很多方法可以实现这一目标,您可以在这个问题中尝试答案:

How to Animate Addition or Removal of Android ListView Rows

第一个答案正在运作

答案 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