【问题标题】:Recycler view programmatically "modify" item at given position回收站以编程方式“修改”给定位置的项目
【发布时间】:2016-04-24 16:53:27
【问题描述】:

使用 Android 的 RecyclerView,我想更改给定项目的背景(即使它当前不可见)。

我看到的所有教程都展示了如何使用OnItemClickListener 访问视图,但在我的情况下,必须以编程方式完成,而无需用户进行任何操作。 我只是想检索视图,并能够在其上应用 .setBackground()findViewById() 等函数。

如果拥有我想要编辑的视图位置,我怎样才能做到这一点?

【问题讨论】:

  • 如何知道要更新哪个视图?其他观点? “吉姆”的每一个观点?请添加更多详细信息。

标签: android android-recyclerview adapter


【解决方案1】:

要修改RecyclerView 中列表项的背景,您必须执行以下操作:

  1. 修改RecyclerView.ViewHolder,使其根据RecyclerView.Adapter.onBindViewHolder中传递给它的数据改变视图的背景。

  2. 修改RecyclerView.Adapter.onBindViewHolder,根据背景的暗度将数据传递给RecyclerView.ViewHolder

  3. 在您的RecyclerView.Adapter 上调用notifyDataSetChanged() 以更新GUI 上的RecyclerView

【讨论】:

  • 它知道工作,但你知道我怎样才能等待动画完成,然后再尝试修改项目? moveanimation 同时执行,修改背景颜色会产生奇怪的动画。
  • 我可以想到一个非常快速和简单的解决方案,但并没有完全按照您的要求进行。这个解决方案的结果不是看到项目改变背景颜色然后移动到列表的底部,您将看到原始项目淡出,然后在底部看到一个具有更新背景颜色的新项目淡入.. .so这个解决方案包括:调用RecyclerView.Adapter.hasStableIds(true),然后修改RecyclerView.Adapter.getItemId()以根据项目数据返回不同的值,包括其背景颜色。方法可以不返回真正独特的值
  • 这个可能给你的结果可能会产生更符合你的请求的结果的解决方案如下:也许你可以使用RecyclerView.setLayoutAnimationListener(),并覆盖Animation.AnimationListener.onAnimationEnd()方法来改变背景此时支持数据的颜色而不是立即修改它,但这似乎可能会变得复杂......请告诉我它是怎么回事......
  • 感谢您提供这些解决方案。问题是我希望看到item 沿着我的视野向下移动,飞过所有其他项目。现在,使用github.com/wasabeef/recyclerview-animators 库可以完美运行。我会尝试覆盖onAnimationEnd(),正如你所说,这似乎是个好主意
  • 是的,那个很酷。感谢您的链接:),感谢您的帮助
【解决方案2】:

你可以通过 RecycleView 的 LayoutManager 获取itemView

mRecycleView.getLayoutManager().findViewByPosition(item_position)

【讨论】:

  • 如果视图当前不可见怎么办?它会起作用吗?
  • 将出现异常
  • 那我该如何更新视图,以便当它可见时,它的背景会改变
  • 我不知道你想对物品做什么。如果要按位置设置项目的背景,可以在适配器上进行。如果您想为特殊情况更改项目的背景,您可以为您的 recycleview 添加 setOnScrollListener 并在 onScrolled 方法中,您可以获得可见项目,阅读这篇文章:stackoverflow.com/a/25053500/4097058
  • 这就是我想要做的:我正在显示与某些用户相关的项目。 3 分钟后,每个不活动的用户都被移到回收站视图的末尾,我打电话给notifyItemMoved()。项目位置更改后,我希望能够将其背景更改为较暗的背景,以显示它处于非活动状态。
【解决方案3】:

更改支持 RecyclerView 的数据项的任何属性,该属性用于设置背景并调用 notifiyDataSetChanged()

【讨论】:

    【解决方案4】:
                for(int i =0; i < mRecyclerView2.getAdapter().getItemCount(); i++) {
                    mRecyclerView2.findViewHolderForAdapterPosition(i).itemView.setRotation(-90);
                }
    

    想法来自:https://stackoverflow.com/a/41199130/1815624

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多