【问题标题】:Recyclerview Setting BackGround of ItemRecyclerview设置项目背景
【发布时间】:2018-01-28 22:02:31
【问题描述】:

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

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);
                }
        }
    }

我是否正在尝试正确更改项目背景?出了点问题,因为它在设置颜色的行上崩溃了。注释掉这些行并且滚动工作正常。有人可以指出为什么会发生崩溃吗? 谢谢

【问题讨论】:

    标签: android android-recyclerview background-color


    【解决方案1】:

    您似乎不了解 ViewHolder 模式。

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

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

    我不完全理解您的用例,但是如果您在 onScroll 期间反复调用您的方法,那么它的性能真的很差,更清洁的解决方案是修改您的适配器 onBindViewHolder 以正确修改焦点视图并调用 @987654324 @ 触发重新绑定新/旧焦点视图。

    【讨论】:

    • 是的,你已经解决了我的问题。我想我现在明白它是如何工作的了。我将重组以利用适配器,而不是尝试修改回收器本身。谢谢
    猜你喜欢
    • 1970-01-01
    • 2023-01-17
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多