mar*_*337 1 android kotlin android-recyclerview
我正在使用带有水平 LinearLayoutManager 的 recyclerview。当项目在中间对齐时,我想更改 recyclerview 项目颜色。
所以我使用了 LinearSnapHelper。
目前,之前捕捉的每个项目都保持捕捉的背景颜色。所以我做了什么,我创建了全局变量 snappedPosition 并将其设置为 0,因此默认情况下将捕捉 recyclerview 的第一项。
然后我在适配器的 onBindViewHolder 中调用了 snappedPosition 并将项目的颜色更改为 recyclerview 中每个项目的默认颜色,除了与捕捉项目位置相同的项目。但是在 notifyItemChanged(position) 我得到了:
java.lang.IllegalStateException:RecyclerView 正在计算布局或滚动 android.support.v7.widget.RecyclerView 时无法调用此方法
片段内的代码:
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)
}
}
}
})
Run Code Online (Sandbox Code Playgroud)
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)
}
}
Run Code Online (Sandbox Code Playgroud)
我想要实现的类似于这个图像示例:
更新:颜色变化变体的代码示例(仍然无效):
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)
}
}
}
})
Run Code Online (Sandbox Code Playgroud)
尝试以下操作来跟踪当前捕捉的视图,设置适当的背景并在移动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) {
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1968 次 |
| 最近记录: |