Recyclerview设置BackGround项目

时间:2018-01-28 22:02:32

标签: android android-recyclerview background-color

我有一个简单的水平回收视图。当用户滚动时,当前项目失去焦点,背景设置为透明,新焦点项目的背景颜色变为绿色。我有一个简单的方法,它采取聚焦位置,改变它的颜色,并将项目的重置设置为透明。

public void resetRecycleColor(int rowindex){
        for(int i=0; i < mRecyclerView.getAdapter().getItemCount(); i++){
            if(i== this.rowindex){
                Log.v("SCROLLS ", "COLOR GREEN "+ i);
               mRecyclerView.getLayoutManager().findViewByPosition(i).setBackgroundColor(Color.GREEN);

            }else{
                Log.v("SCROLLS ", "COLOR TRANSPARENT "+i );
               mRecyclerView.getLayoutManager().findViewByPosition(i).setBackgroundResource(R.color.gridBackgroundBlack);
                }
        }
    }

我是否正在尝试正确更改项目背景?出现问题是因为它在设置颜色的行上崩溃了。注释掉那些行和滚动工作正常。有人可以指出崩溃可能发生的原因吗? 感谢

1 个答案:

答案 0 :(得分:0)

您似乎不了解ViewHolder模式。

您只有足够的视图(加上大约2个)来填充RecyclerView。例如,如果您有2000个项目,但它们在列表中显示,每个项目显示3个项目,则您只创建了5个ViewHolders。这样,当滚动退出屏幕的视图时,从另一侧重新进入,但显示的值会更改(在OnBindViewHolder中)。

findViewByPosition(i)发生了崩溃,因为您尝试获取整个列表的视图,但只有少数几个视图,因此返回null。

我完全不了解你的用例,但是如果你在onScroll期间反复调用你的方法,那么它的性能非常差,更干净的解决方案是修改你的适配器onBindViewHolder以正确修改焦点视图和调用notifyItemChanged()触发新/旧焦点视图的重新绑定。