Recyclerview实现类似launcher翻页效果

1.Gif效果

在这里插入图片描述

2. Activity

public class MainActivity extends BaseActivity {

		private static final String TAG = "xiao";

		private final List<String> books = new ArrayList<>();

		@Override
		protected void onCreate(Bundle savedInstanceState) {
				super.onCreate(savedInstanceState);
				setContentView(R.layout.activity_main);
				testRecyclerView();
		}

		private void testRecyclerView() {

				for (int i = 0; i < 13; i++) {
						books.add("书" + i);
				}

				RecyclerView rcv = findViewById(R.id.recyclerview);

				BookAdapter bookAdapter = new BookAdapter();
				// spanCount为2
				GridLayoutManager layoutManager = new BookLayoutManager(this, 2,
								LinearLayoutManager.HORIZONTAL, false);

				rcv.setLayoutManager(layoutManager);

				rcv.setAdapter(bookAdapter);
                // 左右滑动固定翻页的效果实现
				SnapHelper pagerSnapHelper = new GridPagerSnapHelper();
				pagerSnapHelper.attachToRecyclerView(rcv);

		}


		private enum BookType {
				EDUCATION,
				EMPRISE,
				DEVELOP
		}

		private static class GridPagerSnapHelper extends SnapHelper {
				private static final int MAX_SCROLL_ON_FLING_DURATION = 100; // 最大滚动时间
				private RecyclerView recyclerView;

				@Override
				public void attachToRecyclerView(@Nullable RecyclerView recyclerView) throws IllegalStateException {
						super.attachToRecyclerView(recyclerView);
						this.recyclerView = recyclerView;
				}

				@Nullable
				@Override
				public int[] calculateDistanceToFinalSnap(@NonNull RecyclerView.LayoutManager layoutManager, @NonNull View targetView) {
						int[] out = new int[2];
						if (layoutManager.canScrollHorizontally()) {
								out[0] = distanceToStart(targetView, OrientationHelper.createHorizontalHelper(layoutManager));
						}
						return out;
				}

				@Nullable
				@Override
				public View findSnapView(RecyclerView.LayoutManager layoutManager) {
						return findStartView(layoutManager, OrientationHelper.createHorizontalHelper(layoutManager));
				}

				@Override
				public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) {
						if (layoutManager instanceof GridLayoutManager) {
								GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;

								// 获取GridLayoutManager的spanCount
								int spanCount = gridLayoutManager.getSpanCount();

								// 获取当前可见的第一个item位置
								int firstVisibleItem = gridLayoutManager.findFirstVisibleItemPosition();

								if (firstVisibleItem == RecyclerView.NO_POSITION) {
										return RecyclerView.NO_POSITION;
								}

								int targetPosition;

								// 根据水平滚动方向的速度来确定下一页或上一页
								if (velocityX > 0) {
										// 向右滚动,移动到下一页
										targetPosition = firstVisibleItem + spanCount;
								} else {
										// 向左滚动,移动到上一页
										targetPosition = firstVisibleItem - spanCount;
								}

								// 确保目标位置不越界
								int itemCount = layoutManager.getItemCount();
								targetPosition = Math.min(Math.max(0, targetPosition), itemCount - 1);

								return targetPosition;
						}

						return RecyclerView.NO_POSITION;
				}


				private int distanceToStart(View targetView, OrientationHelper helper) {
						return helper.getDecoratedStart(targetView) - helper.getStartAfterPadding();
				}

				private View findStartView(RecyclerView.LayoutManager layoutManager, OrientationHelper helper) {
						if (!(layoutManager instanceof GridLayoutManager)) {
								return null;
						}

						int firstChild = ((GridLayoutManager) layoutManager).findFirstVisibleItemPosition();
						if (firstChild == RecyclerView.NO_POSITION) {
								return null;
						}

						View firstChildView = layoutManager.findViewByPosition(firstChild);

						int firstChildStart = helper.getDecoratedStart(firstChildView);
						if (firstChildStart >= helper.getStartAfterPadding() + (helper.getTotalSpace() / 2)) {
								return null;
						}
						return firstChildView;
				}
		}


		private static class BookLayoutManager extends GridLayoutManager {

				public BookLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) {
						super(context, spanCount, orientation, reverseLayout);
				}

				@Override
				public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
						super.onLayoutChildren(recycler, state);
						int parentWidth = getWidth();
						int parentHeight = getHeight();
						for (int i = 0; i < getChildCount(); i++) {
								View child = getChildAt(i);
								ViewGroup.LayoutParams params = child.getLayoutParams();
								Log.d(TAG, "getSpanCount(): " + getSpanCount());
								params.width = parentWidth / getSpanCount();
								params.height = parentHeight / getSpanCount();
								child.setLayoutParams(params);
						}
				}
		}

		private class BookAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
				@NonNull
				@Override
				public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
						LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
						View view = inflater.inflate(R.layout.book_item, null);
						switch (viewType) {
								case 0:
										return new EducationViewHolder(view);
								case 1:
										return new EmpriseViewHolder(view);
								case 2:
										return new DevelopViewHolder(view);
						}
						throw new IllegalArgumentException("unknown type...");
				}

				@Override
				public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
						View itemView = holder.itemView;
						TextView book = itemView.findViewById(R.id.book);
						if (getItemViewType(position) == BookType.EDUCATION.ordinal()) {
								book.setText("教育型书籍, position: " + position);
						}

						if (getItemViewType(position) == BookType.EMPRISE.ordinal()) {
								book.setText("武侠型书籍, position: " + position);
						}


						if (getItemViewType(position) == BookType.DEVELOP.ordinal()) {
								book.setText("成长型书籍, position: " + position);
						}
				}

				@Override
				public int getItemCount() {
						return books.size();
				}

				@Override
				public int getItemViewType(int position) {
						if (position == 1) return BookType.DEVELOP.ordinal();
						if (position == 2) return BookType.EMPRISE.ordinal();
						return BookType.EDUCATION.ordinal();
				}


				private class EducationViewHolder extends RecyclerView.ViewHolder {
						public EducationViewHolder(@NonNull View itemView) {
								super(itemView);
						}
				}

				private class EmpriseViewHolder extends RecyclerView.ViewHolder {
						public EmpriseViewHolder(@NonNull View itemView) {
								super(itemView);
						}
				}


				private class DevelopViewHolder extends RecyclerView.ViewHolder {
						public DevelopViewHolder(@NonNull View itemView) {
								super(itemView);
						}
				}
		}
}

3. item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <TextView
        android:id="@+id/book"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</androidx.constraintlayout.widget.ConstraintLayout>

GIF录制工具链接: 点击这里跳转获取

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要使用RecyclerView实现图文列表,可以按照以下步骤进行操作: 1. 在布局文件中添加RecyclerView控件 ``` <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:clipToPadding="false" android:padding="5dp" android:scrollbars="vertical" /> ``` 2. 创建RecyclerView的Adapter类 ``` public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private List<MyData> dataList; public MyAdapter(List<MyData> dataList) { this.dataList = dataList; } @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_layout, parent, false); return new MyViewHolder(itemView); } @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { MyData data = dataList.get(position); holder.titleTextView.setText(data.getTitle()); holder.contentTextView.setText(data.getContent()); holder.imageView.setImageResource(data.getImageResource()); } @Override public int getItemCount() { return dataList.size(); } static class MyViewHolder extends RecyclerView.ViewHolder { TextView titleTextView; TextView contentTextView; ImageView imageView; MyViewHolder(@NonNull View itemView) { super(itemView); titleTextView = itemView.findViewById(R.id.title_text_view); contentTextView = itemView.findViewById(R.id.content_text_view); imageView = itemView.findViewById(R.id.image_view); } } } ``` 3. 创建数据类 ``` public class MyData { private String title; private String content; private int imageResource; public MyData(String title, String content, int imageResource) { this.title = title; this.content = content; this.imageResource = imageResource; } public String getTitle() { return title; } public String getContent() { return content; } public int getImageResource() { return imageResource; } } ``` 4. 创建item布局文件 ``` <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:id="@+id/image_view" android:layout_width="72dp" android:layout_height="72dp" android:layout_marginEnd="10dp" android:src="@drawable/ic_launcher_background" /> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical"> <TextView android:id="@+id/title_text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Title" android:textSize="16sp" android:textStyle="bold" /> <TextView android:id="@+id/content_text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Content" android:textSize="14sp" /> </LinearLayout> </LinearLayout> ``` 5. 在Activity中设置RecyclerView的Adapter和LayoutManager ``` RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this)); List<MyData> dataList = new ArrayList<>(); dataList.add(new MyData("Title1", "Content1", R.drawable.image1)); dataList.add(new MyData("Title2", "Content2", R.drawable.image2)); dataList.add(new MyData("Title3", "Content3", R.drawable.image3)); MyAdapter adapter = new MyAdapter(dataList); recyclerView.setAdapter(adapter); ``` 这样就可以实现一个简单的图文列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值