1

我有一个RecyclerView并单击它的项目需要一个新的Activity. 有一个ViewPager包含多个项目。按下后,我正在保存当前项目位置。ViewPager我想要做的是当用户站在RecyclerView.

问题

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

view = layoutManager.findViewByPosition(Utils.ayat);
if(view != null) {
    LinearLayout parent = (LinearLayout) view.findViewById(R.id.parent);
    parent.setBackgroundColor(Color.GRAY);
}

但如果项目不可见,则什么也没有发生,我无法更改背景。

到目前为止我做了什么

  1. 试图滚动到一个位置,然后改变背景。RecyclerView滚动正确,但findViewByPosition返回 null。
  2. 我相信根据我的观察(可能是错误的),在以编程方式滚动RecyclerView时,它被滚动到的位置将是它最后一个可见的项目。我试图这样做,但没有运气。
  3. 正如许多人所建议的那样,放置Thread.sleep(100)然后尝试获得位置。这也没有用。

注意:我不能这样做,onBindViewHolder因为要突出显示的项目不是预定义的。

4

3 回答 3

1

返回列表时不要强制更改背景颜色,您应该存储突出显示的项目(索引)列表并onBindViewHolder(...)检查项目是否突出显示,并相应地更新其背景(请记住,当项目没有时也要清除背景突出显示)。

这通常是您应该始终使用RecyclerView.

于 2017-04-04T12:18:31.097 回答
0

通过调用 notifyItemChanged(position); 方法尝试使用 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 方法中使用位置更改背景。我认为这会对你有所帮助。

于 2017-04-04T12:26:28.000 回答
0

你试过notifyItemChanged(int position)吗?您可以通过方法和调用将突出显示的项目位置发送给适配器notifyItemChanged(int 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
      }
  }
于 2017-04-04T12:23:48.680 回答