![](/img/trans.png)
[英]Horizontal recyclerview with snaphelper, how to center first and last element?
[英]How to change background color of center element using Snaphelper
我想更改居中位置元素的背景颜色。 我使用了垂直 snapHelper 并且我的中心元素也被检测到,所以我只想为中心元素添加背景颜色。
LinearSnapHelper snapHelper = new LinearSnapHelper() {
@Override
public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) {
View centerView = findSnapView(layoutManager);
if (centerView == null)
return RecyclerView.NO_POSITION;
int position = layoutManager.getPosition(centerView);
int targetPosition = -1;
if (layoutManager.canScrollHorizontally()) {
if (velocityX < 0) {
targetPosition = position - 1;
} else {
targetPosition = position + 1;
}
}
if (layoutManager.canScrollVertically()) {
if (velocityY < 0) {
targetPosition = position - 1;
} else {
targetPosition = position + 1;
centerView.getBackground().setColorFilter(Color.parseColor("#000000"), PorterDuff.Mode.DARKEN);
}
}
final int firstItem = 0;
final int lastItem = layoutManager.getItemCount() - 1;
targetPosition = Math.min(lastItem, Math.max(targetPosition, firstItem));
return targetPosition;
}
};
}
您可以将滚动侦听器注册到RecyclerView
,并在滚动结束时(即处于SCROLL_STATE_IDLE
状态); snapHelper.findSnapView()
不应返回null
值; 所以你可以设置它的颜色。
final LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// Detect scroll end
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
// Resetting all the loaded items to the default color
int firstVisibleItemPosition =
layoutManager.findFirstVisibleItemPosition();
int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
for (int i = firstVisibleItemPosition; i <= lastVisibleItemPosition; i++) {
RecyclerView.ViewHolder holder = recyclerView.findViewHolderForAdapterPosition(i);
// Rest to the default color of other loaded items
holder.itemView.setBackgroundColor(ResourcesCompat.getColor(getResources(), R.color.defaultColor, null));
}
// Changing the background of the snaphelper centered item
View centerView = snapHelper.findSnapView(layoutManager);
if (centerView != null)
centerView.setBackgroundColor(ResourcesCompat.getColor(getResources(), R.color.centerColor, null));
}
}
});
科特林:
val layoutManager = recyclerView.layoutManager as LinearLayoutManager
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
// Detect scroll end
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
val firstVisibleItemPosition =
layoutManager.findFirstVisibleItemPosition()
val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition()
for (i in firstVisibleItemPosition..lastVisibleItemPosition) {
val holder =
recyclerView.findViewHolderForAdapterPosition(i)
// Resetting all the loaded items to the default color
holder!!.itemView!!.setBackgroundColor(ResourcesCompat.getColor(resources, R.color.defaultColor, null))
}
// Changing the background of the snaphelper centered item
val centerView: View? = snapHelper.findSnapView(layoutManager)
centerView.setBackgroundColor(ResourcesCompat.getColor(resources, R.color.centerColor, null))
}
}
})
更新:
有一种比遍历所有 RV 加载的项目更好的方法来重置为默认颜色; 只需将之前的 centralView 保存到本地字段中,并更新其颜色而不是更新整个加载的项目:
View previousCenteredView;
final LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// Detect scroll end
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
// Changing the background of the snaphelper centered item
View centerView = snapHelper.findSnapView(layoutManager);
previousCenteredView = centerView;
if (centerView != null)
centerView.setBackgroundColor(ResourcesCompat.getColor(getResources(), R.color.centerColor, null));
} else if (previousCenteredView != null){
// Resetting previous centered view to the default color
previousCenteredView.setBackgroundColor(ResourcesCompat.getColor(getResources(), R.color.defaultColor, null));
previousCenteredView = null;
}
}
});
科特林:
var previousCenteredView: View? = null
val layoutManager = recyclerView.layoutManager as LinearLayoutManager
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
// Detect scroll end
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
// Changing the background of the snaphelper centered item
val centerView: View? = snapHelper.findSnapView(layoutManager)
previousCenteredView = centerView
centerView.setBackgroundColor(ResourcesCompat.getColor(resources, R.color.centerColor, null))
} else if (previousCenteredView != null){
// Resetting previous centered view to the default color
previousCenteredView.setBackgroundColor(ResourcesCompat.getColor(resources, R.color.defaultColor, null))
previousCenteredView = null
}
}
})
要设置视图的背景色,可以使用多种方法进行检查
根据您的代码,您正在设置视图的背景颜色,但仅在if
语句内部,因此请尝试提取位于if
之后的行。
...
if (layoutManager.canScrollVertically()) {
if (velocityY < 0) {
targetPosition = position - 1;
} else {
targetPosition = position + 1;
}
}
centerView.getBackground().setColorFilter(Color.parseColor("#000000"), PorterDuff.Mode.DARKEN);
final int firstItem = 0;
final int lastItem = layoutManager.getItemCount() - 1;
targetPosition = Math.min(lastItem, Math.max(targetPosition, firstItem));
return targetPosition;
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.