我们在横向滑动recyview 的时候希望选中项可以居中显示,然后设置要选中的项时该项会自动居中,当只有一个item或者总长度小于屏幕宽度时会默认显示在最左边。下面提供解决这三个需求的方法。
点击选中项自动居中:
mAdapter.setOnItemClickListener(new HomeAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position) {
int firstPosition = layoutManager.findFirstVisibleItemPosition();
int lastPosition = layoutManager.findLastVisibleItemPosition();
int left = horizonRecyView.getChildAt(position - firstPosition).getLeft();
int right = horizonRecyView.getChildAt(lastPosition - position).getLeft();
horizonRecyView.scrollBy((left - right)/2,0);
}
});
设置要选中的项自动居中显示:
/**
* recyView 滑动到指定的项 并且居中显示
*/
protected void scrollRecyViewItem(final int position) {
horizonRecyView.scrollToPosition(position);
mAdapter.setAdapterSelected(position);//选中状态
recyViewHandler.postDelayed(new Runnable() {
@Override
public void run() {
int firstPosition = layoutManager.findFirstVisibleItemPosition();
int lastPosition = layoutManager.findLastVisibleItemPosition();
int left = horizonRecyView.getChildAt(position - firstPosition).getLeft();
int right = horizonRecyView.getChildAt(lastPosition - position).getLeft();
horizonRecyView.scrollBy((left - right) / 2, 0);
}
}, 50);
}
protected Handler recyViewHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
小于屏幕宽度的时候居中显示:
/**
* @param num list的size,也就是多少个item
* @param itemWight 每一个item的宽度,像素
* @param view 控件可以是recyclerView
*/
private void setAncestralRecyclerCenterHor(int num, int itemWight, View view) {
// int interval = DensityUtil.dp2px(4f, this);//每个item之间的间隔 宽度,ScreenUtil.dp2px(4f, this)是我自定义写的dp转像素的工具,你可以随便写值
int totalHasWight = getWindowWeith() - num * (DensityUtil.dp2px(getActivity(), itemWight));//屏幕一栏宽度总共还剩多少距离没占,MyApplication.screenWidth是我的屏幕宽度,这里你可以写你的recyclerView总共是多宽,如果占满屏幕,你可以直接拿屏幕宽度
if (totalHasWight > 0) {//如果 屏幕一栏宽度总共还剩多少距离没占 >0.,那么改变外面大控件 的padding 左(totalHasWight-interval)/2,右totalHasWight/2
view.setPadding((totalHasWight) / 2, 0, totalHasWight / 2, 0);
} else {
view.setPadding(0, 0, 0, 0);
}
}