我正在基于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(),我失去了花哨的动画。有什么建议吗?
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);
}
不,这是错误的。首先,在该方法返回后,不能引用传递给onBindViewHolder的位置。当视图位置发生变化(由于项目移动等原因)时,RecyclerView不会重新绑定视图。
相反,您可以使用ViewHolder#getPosition()
返回更新的位置。
如果你解决了这个问题,你的移动代码应该可以工作
调用notifyDataSetChanged将阻止预测性动画,因此请尽可能避免它。有关详细信息,请参阅文档。
编辑(来自注释):要从外部获取位置,从回收视图获取子视图持有者,然后从vh获取位置。有关详细信息,请参阅RecycraView api
有一种方法可以保留花哨的动画,只需通知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)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的