我有一个简单的水平回收视图。当用户滚动时,当前项目失去焦点,背景设置为透明,新焦点项目的背景颜色变为绿色。我有一个简单的方法,它采取聚焦位置,改变它的颜色,并将项目的重置设置为透明。
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);
}
}
}
我是否正在尝试正确更改项目背景?出现问题是因为它在设置颜色的行上崩溃了。注释掉那些行和滚动工作正常。有人可以指出崩溃可能发生的原因吗? 感谢
答案 0 :(得分:0)
您似乎不了解ViewHolder模式。
您只有足够的视图(加上大约2个)来填充RecyclerView。例如,如果您有2000个项目,但它们在列表中显示,每个项目显示3个项目,则您只创建了5个ViewHolders。这样,当滚动退出屏幕的视图时,从另一侧重新进入,但显示的值会更改(在OnBindViewHolder
中)。
findViewByPosition(i)
发生了崩溃,因为您尝试获取整个列表的视图,但只有少数几个视图,因此返回null。
我完全不了解你的用例,但是如果你在onScroll期间反复调用你的方法,那么它的性能非常差,更干净的解决方案是修改你的适配器onBindViewHolder
以正确修改焦点视图和调用notifyItemChanged()
触发新/旧焦点视图的重新绑定。