Android 在特定位置更改RecyclerView项目的背景

Android 在特定位置更改RecyclerView项目的背景,android,android-recyclerview,linearlayoutmanager,Android,Android Recyclerview,Linearlayoutmanager,我有一个RecyclerView,点击它的项目将进入一个新的活动。有一个包含多个项目的ViewPager。按back键时,我保存当前项目位置。我想做的是,当用户站在ViewPager中的任何项目上按下back键时,该项目应该在RecyclerView中高亮显示 问题 当项目的位置可见时,没有问题。我使用以下命令更改背景 view = layoutManager.findViewByPosition(Utils.ayat); if(view != null) { LinearLayout

我有一个RecyclerView,点击它的项目将进入一个新的活动。有一个包含多个项目的ViewPager。按back键时,我保存当前项目位置。我想做的是,当用户站在ViewPager中的任何项目上按下back键时,该项目应该在RecyclerView中高亮显示

问题

当项目的位置可见时,没有问题。我使用以下命令更改背景

view = layoutManager.findViewByPosition(Utils.ayat);
if(view != null) {
    LinearLayout parent = (LinearLayout) view.findViewById(R.id.parent);
    parent.setBackgroundColor(Color.GRAY);
}
但若项目是不可见的,并没有发生任何事情,我不能改变背景

到目前为止我做了什么

尝试滚动到某个位置,然后更改背景。RecyclerView正在正确滚动,但findViewByPosition返回null。 我相信从我的观察来看,在以编程方式滚动RecyclerView时,它被滚动到的位置将是最后一个可见项,这可能是错误的。我试着那样做,但没有成功。 正如许多人建议的那样,放置Thread.sleep100,然后尝试获取位置。这也不管用。
注意:我无法在onBindViewHolder上执行此操作,因为要突出显示的项目不是预定义的。

在返回列表时,不必强制更改背景颜色,而应在onBindViewHolder中存储突出显示的项目索引列表并。。。检查项目是否突出显示,并相应更新其背景。记住,当项目未突出显示时,也要清除背景

这通常是您应该始终使用RecyclerView的方式。

您是否尝试过notifyItemChangedint位置?您可以通过方法将突出显示的项目位置发送到适配器,并调用notifyItemChangedint position。比如说,

int highlightPosition = -1;

    public updateHighlightPosition(int position){
      highlightPosition = position;
      notifyItemChanged(position)
    }

    @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
      if(position == highlightPosition ){
         // You can change the background here
      }else{
        // Set default background
      }
  }

通过调用notifyItemChangedposition方法,尝试使用RecyclerView.AdapterDataObserver类

无论何时使用特定位置调用notifyItemChanged方法,它都将调用AdapterDataObserver类。因此,首先,您需要将我在下面给出的代码粘贴到适配器类中。看看我的例子,你会有一些想法来达到你的要求

RecyclerView.AdapterDataObserver adapterDataObserver = new RecyclerView.AdapterDataObserver() {
    @Override
    public void onItemRangeChanged(int positionStart, int itemCount) {
        super.onItemRangeChanged(positionStart, itemCount);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
                manager.scrollToPositionWithOffset(positionStart, 0);
                RecyclerView.ViewHolder rebindViewHolder = recyclerView.findViewHolderForLayoutPosition(positionStart);
                if (rebindViewHolder != null) {
                    onBindViewHolder((ViewHolder) rebindViewHolder, positionStart);
                }
            }
        }, 1000);
    }
};
完成此操作后,在onBindViewHolder方法中,使用位置更改背景。
我想这会对您有所帮助。

索引不是预定义的,我不能这样做。您突出显示特定行总是有原因的。通过索引或某些数据属性高亮显示该行是行修改。正如©Palanivelraghul的解决方案中所述,一旦您想突出显示您的项目,请使用notifyItemChanged。最好不要在RecyclerView的内部布局上假设任何其他内容,不能保证子位置与您看到的内容相匹配。问题是,当我尝试获取当前不可见的视图时,它返回null。那么,我什么时候调用notifyItemChanged?您不应该尝试获取视图-只需在onActivityResult期间调用notifyItemChanged即可。不要认为你需要修改视图,你需要修改正在显示的数据,让RecyclerView为你做这项工作。对不起,兄弟,我不明白你想说什么。我不需要修改数据,我需要修改视图。让我们想象一下,如果我在RecyclerView的特定位置获取数据,我将如何处理这些数据?我需要改变背景,而不是价值。问题是,指数不是预定义的,不能在内部完成onBindViewHolder@WaqasAhmedAnsari对不起,伙计。我不明白,但若物品不可见,那个么什么也并没有发生,我也不能改变背景。@WaqasAhmedAnsari你们说你们已经储存了那个位置。因此,当返回时,使用该位置并使用notifyItemChangedviewedItemPosition刷新recyclerview。当我点击项目时,它会将我带到其他活动,该活动具有ViewPager,其中包含实际位于recyclerview中的多个项目。我开始在新活动中阅读,然后翻到另一页并按back。现在我有了一个在RecyclerView中不可见的新位置。这是case@WaqasAhmedAnsari您希望使用post delay滚动到该位置。然后,通过调用onBindViewHolder,您可以更改RecyclerView中特定项的背景。当RecyclerView计算布局或滚动时,您不能调用updatehighlights方法。它也应该是空的,并在if else块内更新它。这里有这么多错误的事情