当前位置: 首页 > 知识库问答 >
问题:

回收人员视图SnapHelper-如何改变背景的抓拍和未抓拍的项目?

羊舌胡非
2023-03-14

我正在使用recyclerview和水平线性布局管理器。我想改变recyclerview项目的颜色,当项目被捕捉到中间时。

所以我使用了LinearSnapHelper。

目前,之前拍摄的每件物品都保留了拍摄的背景色。所以,我做了一个全局变量SnapdPosition,并将其设置为0,所以默认情况下,recyclerview的第一项将被捕捉。

然后我在我的适配器的onBindViewHolder中调用了那个snapesdPotion,并将项目的颜色更改为默认的,除了一个与已抓取项目的位置相同的项目。

JAVAlang.IllegalStateException:当RecyclerView正在计算布局或滚动android时,无法调用此方法。支持v7。小装置。回收视图

片段里面的代码:

val snapHelper: LinearSnapHelper = LinearSnapHelper()
var snappedPosition: Int = 0

        addressRecyclerView = view.findViewById<RecyclerView>(R.id.address_recycler_view).apply {

            setHasFixedSize(true)
            layoutManager = viewManager
            adapter = viewAdapter

        }

        snapHelper.attachToRecyclerView(addressRecyclerView)
        addressRecyclerView.onFlingListener = snapHelper
        itemOffsetDecoration = ItemOffsetDecoration(context, R.dimen.address_recyclerview_padding)
        addressRecyclerView.addItemDecoration(itemOffsetDecoration)

        addressRecyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
                if (newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
                    val centerView = snapHelper.findSnapView(viewManager)
                    if (centerView != null) {

                        snappedPosition = addressRecyclerView.getChildAdapterPosition(centerView)
                    }
                }
            }
        })

onBindViewHolder中的代码

addressList[position].let {


                if (position == fragment.snappedPosition){
                    holder.itemViewLayout.setBackgroundResource(R.drawable.payment_button_active)
                    notifyItemChanged(position)
                } else {
                    holder.itemViewLayout.setBackgroundResource(R.drawable.payment_button_inactive)
                    notifyItemChanged(position)
                }

            }

我想实现的是类似于这个图像示例:

更新:颜色变化变体的代码示例(仍然不工作):

addressRecyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
                if (newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
                    val centerView = snapHelper.findSnapView(addressRecyclerView.layoutManager)
                    if (centerView != null) {
                        for(item in 0 until addressRecyclerView.layoutManager.childCount){
                            val holder: RecyclerView.ViewHolder = addressRecyclerView.findViewHolderForAdapterPosition(item)
                            holder.itemView.setBackgroundResource(R.drawable.payment_button_inactive)
                        }
                        centerView.setBackgroundResource(R.drawable.payment_button_active)

                    }
                }
            }
        })

共有1个答案

赵飞雨
2023-03-14

尝试以下操作以跟踪当前的快照视图,设置适当的背景,并在移动RecyclerView时将其清除。这样可以避免对适配器进行修改。

    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                View view = mSnapHelper.findSnapView(recyclerView.getLayoutManager());
                view.setBackgroundColor(getResources().getColor(android.R.color.holo_green_light));
                mLastSnappedView = view;
            } else if (mLastSnappedView != null) {
                mLastSnappedView.setBackgroundColor(getResources().getColor(android.R.color.white));
                mLastSnappedView = null;
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        }
    });
 类似资料:
  • 我正在使用来使我的中的项目在屏幕上“对齐”(我的卡片占据了屏幕的大部分,所以我希望它们在每次刷/抛/滚动时都对齐并填充屏幕)。 我在苦苦思索如何让卡片更快地卡入位。我已经尝试创建自定义的(并编辑或中的方法),以及自定义的(并编辑fling方法)。但没有任何东西影响卡“卡”入位的速度。 我想问题是我真的不明白是如何将卡片“滚动”到正确的位置的。它似乎没有使用的或方法。

  • 我已经被困在这个问题上几天了,真的需要一些帮助和理解如何用DiffUtil设置RecylerView(RV),似乎无论我尝试什么,我都无法让RV更新。我会浏览我所拥有的,希望有人能解释一下我做错了什么。 应用程序启动 创建视图模型, 然后在ViewModel中填充LiveDataList。 LayoutManager和ListAdapter应用于RV 为什么在LiveDataList中添加或删除一

  • 这是我的应用,问题出在哪里 我希望我的物品能像这个应用一样合身 我正在使用带有的。我的问题是,当其中一个项目具有更长的文本时,您可以在图像中看到网格项的高度不相同。我正在从Firebase加载数据,并在列表具有数据时通知。我尝试了一切,但找不到一个解决方案来自动适应项目,如第二张图片所附。有什么帮助吗? 这是我的recyclerview项目布局

  • 本文向大家介绍树莓派动作捕捉抓拍存储图像脚本,包括了树莓派动作捕捉抓拍存储图像脚本的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了树莓派动作捕捉抓拍存储图像的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我开始尝试,我感到惊讶的是,更改

  • 我想把我的混合应用程序的一些截图itunes自动连接。我正在运行Ubuntu 14.04. chromeDrive2.15.322448 使用Selenium和Xvfb自动截图很容易。但是要得到视网膜截图并不容易。 我用更高的dpi启动了我的Xvfb: 当我检查显示信息时,一切似乎都是正确的: 然后我像这样启动我的chromedriver 在完成了一些其他无聊的代码后,我截图: 这不工作。屏幕截图