当前位置: 首页 > 知识库问答 >
问题:

RecycraView适配器通知yDataSetChanged停止花式动画

宰宣
2023-03-14

我正在基于RecyclerView构建一个组件,允许用户通过拖放来重新排序项目。一旦我在DragListener侧,我需要它在适配器中的位置,以便执行正确的移动,但我只能访问视图。下面是我在适配器视图绑定中所做的工作:

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
    Track track = mArray.get(position);
    viewHolder.itemView.setTag(R.string.TAG_ITEM_POSITION, position);
}

你觉得对吗?因为如果我像这样移动一个项目:

public void move(int from, int to){
    Track track = mArray.remove(from);
    mArray.add(to, track);
    notifyItemMoved(from, to);
}

然后位置标签不再正确,如果我通知fyDataSetChanged(),我失去了花哨的动画。有什么建议吗?

共有3个答案

应涵容
2023-03-14

1) 您将使用notifyItemInserted(位置) notifyItemRemoved(位置) 而不是动画的notifyDataSetChanged()。2) 您可以手动修复您的问题-使用

public void move(int from, int to){
    Track track = mArray.remove(from);
    mArray.add(to, track);
    notifyItemMoved(from, to);
    ViewHolder fromHolder = (ViewHolder) mRecyclerView.findViewHolderForPosition(from);
    ViewHolder toHolder = (ViewHolder) mRecyclerView.findViewHolderForPosition(to);
    Tag fromTag = fromHolder.itemView.getTag();
    fromHolder.itemView.setTag(toHolder.itemView.getTag()); 
    toHolder.itemView.setTag(fromTag);

}

彭华皓
2023-03-14

不,这是错误的。首先,在该方法返回后,不能引用传递给onBindViewHolder的位置。当视图位置发生变化(由于项目移动等原因)时,RecyclerView不会重新绑定视图。

相反,您可以使用ViewHolder#getPosition()返回更新的位置。

如果你解决了这个问题,你的移动代码应该可以工作

调用notifyDataSetChanged将阻止预测性动画,因此请尽可能避免它。有关详细信息,请参阅文档。

编辑(来自注释):要从外部获取位置,从回收视图获取子视图持有者,然后从vh获取位置。有关详细信息,请参阅RecycraView api

夏知
2023-03-14

有一种方法可以保留花哨的动画,只需通知fyDataSetChanged()

>

  • 你需要使你自己的GridLayoutManager与overriden支持PredictiveItemAnimations()方法返回true

    你需要mAdapter.setHasStableIds(true)

    我觉得棘手的部分是你需要覆盖适配器的getItemId()方法。它应该返回真正唯一的值,而不是位置的直接函数。类似的东西mItems.get(位置). hashCode()

    在我的例子中效果非常好-仅使用notifyDataSetChanged()

  •  类似资料:
    • 问题内容: 无论如何,有手动启动/初始化通道适配器吗? 我的context.xml中有两对入站/出站适配器,并且想在运行时确定我要开始使用哪一对。 编辑: 具体方案: 我有一个客户端,可以在运行时将其配置为mqtt发布者或订阅者。 我的context.xml看起来像这样: 如您所见,我有两个设置: 1.订阅者案例:读取mqtt消息->写入文件 2.发布者案例:从目录中轮询文件->通过mqtt发送

    • 所以我有一个问题,我对android编程很陌生,我开始编程android应用程序才6-8周,所以我可能是盲人,看不到简单的答案,但我的问题是: 我正在做一个学校项目,我试图开发一个类似于今天日历分割视图中的日历(下面的一个) 我用GridLayoutManager创建了一个RecyclerView,如下所示: 在此之前,一切都很好,但我正在尝试实现一个按钮,该按钮将日历设置为今天的日期,问题是当我

    • 问题内容: 我正在尝试从广播接收器启动状态栏通知,然后从另一个广播接收器停止它,但是出现问题。当USB连接时,我想在状态栏中启动通知,然后当USB断开连接时,我想停止它。我已经设置了两个接收器,并且正在努力从接收器中启动和停止一个接收器,这是代码我目前有 我的代码唯一的错误是该行,该错误仅表明getSystemService未定义,并且它想使该方法(我认为这意味着接收者不像活动那样支持该方法),所

    • 我在创建计时器点击00:00时发送通知的方法时遇到一些问题。 我的意思是,我希望当计时器结束时,如果应用程序关闭,它会发送一个通知事件。 我已经找到了一种方法来显示通知,并使计时器即使在应用程序关闭时也能工作。 但当我把功能发送通知在计时器的末尾它只工作时,应用程序打开。 这是我的主要活动。JAVA AppJava类 AndroidManifest。xml 谢谢你的帮助! 祝你有愉快的一天 克里斯

    • 我们的应用程序使用一个Spring Integration轮询一个目录,以便在将文件丢弃到该目录时侦听该目录。然后,Spring Integration启动一个Spring批处理作业,将要处理的文件的路径和名称交给该作业。 显然,即使在Spring批处理作业处理了一个文件之后,文件轮询器仍在继续运行。因此,Spring上下文保持打开,应用程序不会终止。是否有一种方法,通过编程或配置(更好),在一个

    • 主要内容:介绍,实现,MediaPlayer.java,AdvancedMediaPlayer.java,VlcPlayer.java,Mp4Player.java,MediaAdapter.java,AudioPlayer.java,AdapterPatternDemo.java适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的