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

时间:2017-04-04 12:09:54

标签: android android-recyclerview linearlayoutmanager

我有一个[Route("api/Hello")] public class HelloController : Controller { StudentContext db = new StudentContext(); [HttpGet] // Matches GET api/Hello [HttpGet("Ghouse")] // Matches GET api/Hello/Ghouse public string Ghouse() { var x = from n in db.StudentMaster select n; return "Hello Ghouse"; } } ,点击其商品会转到新的RecyclerView。有一个Activity有多个项目。在按下时,我正在保存当前项目位置。我想要做的是当用户站在ViewPager的任何项目上后退时,该项目应在ViewPager中突出显示。

问题

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

更改背景
RecyclerView

但如果项目不可见,则没有任何反应,我无法更改背景。

我做了什么

  1. 尝试滚动到某个位置,然后更改背景。 view = layoutManager.findViewByPosition(Utils.ayat); if(view != null) { LinearLayout parent = (LinearLayout) view.findViewById(R.id.parent); parent.setBackgroundColor(Color.GRAY); } 滚动正确但RecyclerView返回null。
  2. 我相信我的观察(可能是错的)在以编程方式滚动findViewByPosition时,滚动的位置将是它的最后一个可见项目。我试着这样做,但没有运气。
  3. 正如许多人所建议的那样,放RecyclerView然后尝试获得位置。这也行不通。
  4. 注意:我无法执行此操作Thread.sleep(100),因为要突出显示的项目未预先定义。

3 个答案:

答案 0 :(得分:1)

在返回列表时,不应强制更改背景颜色,而应存储突出显示的项目列表(索引),并在DataTable AllData; private void Form1_Load(object sender, EventArgs e) { AllData = GetDT(); dataGridView1.DataSource = AllData; comboBox1.DataSource = AllData; comboBox2.DataSource = AllData; comboBox1.ValueMember = "sehir"; comboBox2.ValueMember = "ilceler"; } 中检查项目是否突出显示,并相应地更新其背景(请记住当项目未突出显示时也清除背景。

这通常是您应该始终如何使用onBindViewHolder(...)

答案 1 :(得分: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
      }
  }

答案 2 :(得分: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方法中使用position更改背景。 我认为这会对你有所帮助。