rav*_*avi 16 android android-recyclerview
我用a RecyclerView来水平显示项目.我想将所选项目设置为视图的中心,如下所示
这就是我这样做的方式:
LinearLayoutManager layoutManager
= new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(layoutManager);
Run Code Online (Sandbox Code Playgroud)
这是用于在滚动时或单击某个项目时在中心对齐项目。
您需要将 SnapHelper 添加到 RecyclerView。方法如下:
final RecyclerView recyclerViewObject = view.findViewById(R.id.recyclerViewObjectId);
final LinearSnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(recyclerViewObject);
recyclerViewObject.setOnFlingListener(snapHelper);
Run Code Online (Sandbox Code Playgroud)
那么你只需调用此代码
recyclerViewObject.addOnItemTouchListener(
new RecyclerItemClickListener(getContext(), recyclerViewObject ,new RecyclerItemClickListener.OnItemClickListener() {
@Override public void onItemClick(View view, int position) {
recyclerViewObject.smoothScrollToPosition(position);
}
@Override public void onLongItemClick(View view, int position) {
}
})
);
Run Code Online (Sandbox Code Playgroud)
要从RecyclerView获取屏幕上的中间项目,可以将OnScrollListener附加到RecyclerView上,在侦听器内部,您应该获取当前项目的位置,然后检查给定项目的区域是否在屏幕中间。
Kotlin中的代码示例:
// Attach OnScrollListener to your RecyclerView
addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
recyclerView.post {
selectMiddleItem()
}
}
})
Run Code Online (Sandbox Code Playgroud)
// implementation of method that is called from OnScrollListener
private fun selectMiddleItem() {
val firstVisibleIndex = layoutManager.findFirstVisibleItemPosition()
val lastVisibleIndex = layoutManager.findLastVisibleItemPosition()
val visibleIndexes = listOf(firstVisibleIndex..lastVisibleIndex).flatten()
for (i in visibleIndexes) {
val vh = findViewHolderForLayoutPosition(i)
if (vh?.itemView == null) {
continue
}
val location = IntArray(2)
vh.itemView.getLocationOnScreen(location)
val x = location[0]
val halfWidth = vh.itemView.width * .5
val rightSide = x + halfWidth
val leftSide = x - halfWidth
val isInMiddle = screenWidth * .5 in leftSide..rightSide
if (isInMiddle) {
// "i" is your middle index and implement selecting it as you want
// optionsAdapter.selectItemAtIndex(i)
return
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果,您应该得到如下内容:
小智 5
您可以使用最少的代码行实现相同的输出。其中,view是所选适配器项目的视图,StaticData.SCREEN_WIDTH是设备宽度。
View view = rvCategory.getChildAt(pos);
if (view == null)
return;
int scrollX = (view.getLeft() - (StaticData.SCREEN_WIDTH / 2)) + (view.getWidth() / 2);
rvCategory.smoothScrollBy(scrollX, 0);
Run Code Online (Sandbox Code Playgroud)
请尝试以下解决方案:
LinearLayoutManager layoutManager = ((LinearLayoutManager)recyclerView.getLayoutManager());
int totalVisibleItems = layoutManager.findLastVisibleItemPosition() - layoutManager.findFirstVisibleItemPosition()
int centeredItemPosition = totalVisibleItems / 2;
recyclerView.smoothScrollToPosition(position);
recyclerView.setScrollY(centeredItemPosition );
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
16241 次 |
| 最近记录: |