Android recycleview横向滑动时 如何做到首尾的item都能滑动到屏幕中间,用Java写个详细demo
时间: 2024-09-07 08:01:16 浏览: 41
在Android中,`RecyclerView`默认只支持垂直滚动。如果你想实现横向滑动并且希望首尾的item能够滑动到屏幕中间,你需要对`RecyclerView`进行一定的自定义。
以下是使用Java实现横向`RecyclerView`并处理首尾item滑动到屏幕中间的简单示例代码。这个例子假设你已经有一个用于显示数据的`RecyclerView.Adapter`。
首先,创建一个自定义的`RecyclerView`布局管理器,继承自`LinearLayoutManager`:
```java
import android.content.Context;
import android.util.AttributeSet;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.LinearLayoutManager;
public class HorizontalRecyclerView extends RecyclerView {
private LinearLayoutManager mLayoutManager;
public HorizontalRecyclerView(Context context) {
super(context);
mLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
setLayoutManager(mLayoutManager);
}
public HorizontalRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
mLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
setLayoutManager(mLayoutManager);
}
public HorizontalRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mLayoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
setLayoutManager(mLayoutManager);
}
@Override
public boolean fling(int velocityX, int velocityY) {
// 判断首尾项是否在屏幕中间,并适当调整滚动位置
int firstItemPosition = mLayoutManager.findFirstVisibleItemPosition();
int lastItemPosition = mLayoutManager.findLastVisibleItemPosition();
RecyclerView.ViewHolder firstViewHolder = findViewHolderForAdapterPosition(firstItemPosition);
RecyclerView.ViewHolder lastViewHolder = findViewHolderForAdapterPosition(lastItemPosition);
if (firstViewHolder != null) {
int firstItemCenter = (firstViewHolder.itemView.getLeft() + firstViewHolder.itemView.getRight()) / 2;
int screenCenter = getWidth() / 2;
int dx = firstItemCenter - screenCenter;
if (dx > 0) {
velocityX = -Math.abs(velocityX);
} else if (dx < 0) {
velocityX = Math.abs(velocityX);
}
}
if (lastViewHolder != null) {
int lastItemCenter = (lastViewHolder.itemView.getLeft() + lastViewHolder.itemView.getRight()) / 2;
int screenCenter = getWidth() / 2;
int dx = lastItemCenter - screenCenter;
if (dx > 0) {
velocityX = Math.abs(velocityX);
} else if (dx < 0) {
velocityX = -Math.abs(velocityX);
}
}
return super.fling(velocityX, velocityY);
}
}
```
然后,在你的布局文件中使用这个自定义的`RecyclerView`:
```xml
<your.package.name.HorizontalRecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
```
最后,确保你的`RecyclerView.Adapter`中的每个`ViewHolder`布局足够宽,以支持横向滑动。
请注意,这个例子仅提供了一个基本的演示,并未包含完整的`Adapter`实现,你可能需要根据实际情况对代码进行调整和优化。
阅读全文