dynamic地将RecyclerView中的视图添加到当前项目

我dynamic地将视图添加到RecyclerView项目中。 这些添加的视图应该只与它们添加的项目有关,但是当我滚动时,我遇到了问题。 看起来这个View被回收了,并且一个新的项目被加载,但是那些以前添加的视图仍然存在,只是现在在错误的项目上。

我假设这只是因为ViewHolder被重用,所以添加的项目再次显示一个新的项目,加载时。

如何解决这个问题呢?

Solutions Collecting From Web of "dynamic地将RecyclerView中的视图添加到当前项目"

你可以用这个! setItemViewCacheSize(int size)在这里检查RecyclerViewDocumentation 。

离屏视图caching保持连接适配器的变化,允许LayoutManager重新使用这些视图,而不需要返回到适配器重新绑定它们。

您需要根据备份数据跟踪已添加的视图。 我可能会在onBindViewHolder()添加任何必要的额外视图,并删除onBindViewHolder()中可能存在的任何onViewRecycled() 。 然后当你想让一个dynamic出现时,改变你跟踪的variables是否应该是可见的,并调用notifyItemChanged()

基于此:

但之前添加的视图仍然存在,但现在在错误的项目。

基本上,根据RecyclerView文档,您必须在onBindViewHolder()方法内重新设置视图,

所以说,你有一个方法设置视图参数,如果它的configuration文件,所以代码相同的如下,

 if (list.get(position).getId()==PreferenceManager.getUserID()) { // do some view change here setViewParam(true); }else { // reset the view change here setViewParam(false); } 

所以你在这里做的是给回收的ViewHolder一个机会重置。 如果您需要帮助,请发表评论!

这是我的一个老问题。 一个赏金被放在它上面,因此人气的激增和多个新的和无关的答案。

正如我对这个答案的评论和@CQM的评论下面我原来的问题所述,答案是重写onViewRecycled()方法,并在那里执行任何需要的操作。 当视图被回收时,这个方法被调用,任何清理操作都可以在这里完成。

这个方法的文档可以在这里find。

在我的情况下,这是删除附加到视图的不可见的TextView的问题。 文本本身已经被删除,但是这个观点依然存在。 如果许多不可见的TextView堆积在视图上,并且在滚动时没有正确地回收,则滚动将开始滞后。

每次添加newView操作发生时,通过标签为具有新子项的项目保存信息。 (以共享首选为例)标签:创build与项目位置onBindViewHolder。

 ... SharedPreference sharedPref = getSharedPreference("text" + position, context); SharedPreference.Editor editor = sharedPref.edit(); editor.putString("view", "ImageView"); ... 

当加载适配器得到这个值,并把默认为空。 我不确定它的效率,但我会工作。

 ... String viewType = sharedPref.getString("view", null); //it will return ImageView 

如果你知道一些可能的viewTypes例如总是要成为ImageView和TextView所以用一些if语句就可以了。

 if(viewType.equals("ImageVIew")){ item(position).addView(new ImageVIew(context)); } 

祝你好运

首先,你能分享一些更多的代码吗?

其次,你为什么要dynamic地添加新的视图? 你为什么不使用不同的VIEWTYPE,或者只是让你的布局已经有了这些视图,并且让它们可见/不可见或者看不见? (我相信这样会更有效率)。

让我提醒你一些关于RecyclerView的东西,是的,当用户正在滚动viewHolder正在被重用(其中很less可以创build,甚至超过它需要填充屏幕)。 所以如果碰巧你在“item A”上添加了一些视图,并且用户滚动到了“item Z”,那么这个viewHolder可以被重新用于这个“item Z”,因此显示了以前添加的视图。

你怎么解决这个问题?

那么总是检查每个项目,如果你需要添加新的意见,如果是添加他们,如果还没有添加,否则总是删除这些意见(如果存在)返回到默认viewHolder状态(或任何你所说的)。

希望这会帮助你。

在您的recyclerView适配器类中,在onBindViewHolder方法中,创build另一个适配器并为新的适配器执行相同的方法。

层次将是,

mainRecyclerView – > item1( – > childRecyclerView1),item2( – > childRecyclerView2),item3( – > childRecyclerView3)

这样你就可以实现你想要的东西,而不会在错误的项目上查看错误的值。

您应该在子项目布局XML使用任何空白布局,例如Linearlayout ,然后在滚动列表中添加视图到您的特定项目的LinearLayout列表中添加到LinearLayout所有子视图也将滚动该项目。