RecyclerView+GridLayout——实现陈列式布局和Item间距的调整

实现类似于小红书的发文和视频布局

一、效果图

效果图如下:

从下图可以看出一行有2个小框,这就是我们所说的陈列式布局。

二、新建一个fragment,在它对应的xml文件中放入一个recyclerView。

我这里使用的是fragment,也可以用activity,但是activity和fragment写的有点不同,具体的不同点可以在CSDN上查找,这里就不阐述了。

我建立的fragment 名称是Travel_video,对应的xml文件叫做fragment_travel_video。需要说明的是我的recyclerView布局高的属性用的是wrap_content,recyclerView的高就会随着内容变化。具体如下:

 三、在项目里的layout文件夹新建一个xml文件,用于存放你要展示的item样式。具体如下:

1、命名时需要在名称后面加上.xml,命名之后直接点OK,我建的名称是item_video.xml。

2、写item的时候为了实现最外面圆角边框,所以加入了CardView,使用时最好先加CardView,然后在CardView里面加一个ConstraintLayout,然后ConstraintLayout里面就可以加你想要展示的东西。

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

    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="250dp"
        app:cardCornerRadius="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <androidx.cardview.widget.CardView
                android:id="@+id/cardView_video"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent">

                <ImageView
                    android:id="@+id/imageView11"
                    android:layout_width="180dp"
                    android:layout_height="180dp"
                    app:srcCompat="@drawable/jingqu" />
            </androidx.cardview.widget.CardView>

            <TextView
                android:id="@+id/textView44"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="5dp"
                android:layout_marginTop="10dp"
                android:text="六百年腾冲银杏村"
                android:textSize="14sp"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/cardView_video" />

            <TextView
                android:id="@+id/textView45"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="TextView"
                android:textSize="12sp"
                app:layout_constraintStart_toStartOf="@+id/textView44"
                app:layout_constraintTop_toBottomOf="@+id/textView44" />

            <TextView
                android:id="@+id/textView46"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="5dp"
                android:text="10"
                app:layout_constraintBottom_toBottomOf="@+id/textView45"
                app:layout_constraintEnd_toEndOf="parent"
                tools:textSize="10sp" />

            <ImageView
                android:id="@+id/imageView30"
                android:layout_width="15dp"
                android:layout_height="15dp"
                android:layout_marginEnd="2dp"
                app:layout_constraintBottom_toBottomOf="@+id/textView46"
                app:layout_constraintEnd_toStartOf="@+id/textView46"
                app:layout_constraintTop_toTopOf="@+id/textView46"
                app:srcCompat="@drawable/aixin" />
        </androidx.constraintlayout.widget.ConstraintLayout>
    </androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>

 四、接下来就开始写fragment里面的内容啦。关于用RecyclerView的具体实现的解释,小伙伴们可以手动CSDN一下,这里就不做解释了,这里主要是介绍一下怎么做RecyclerView的陈列式布局,以及item的间距如何调整。具体如下:

package com.hnucm.gingko_system.Fragment;

import android.content.Context;
import android.content.Intent;
import android.graphics.Rect;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.hnucm.gingko_system.Activity.video_detailsActivity;
import com.hnucm.gingko_system.R;

import java.util.ArrayList;
import java.util.List;

public class Travel_video extends Fragment {
    private View view;
    RecyclerView recyclerView;
    Travel_video.MyAdapter myAdapter;
    private Context context;
    private List<String> videoList;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view=inflater.inflate(R.layout.fragment_travel_video, container, false);
        context =view.getContext();//context是fragment和activity最大的区别(自己总结的,可能有错。。。)
        videoList=new ArrayList<>();
        recyclerView = view.findViewById(R.id.videoRecyclerView);//这里是找到使用的RecyclerView的id
        myAdapter= new Travel_video.MyAdapter(context);
        recyclerView.setAdapter(myAdapter);
        setItemSpace();
        //使用网格布局,并且设置为2列(1行2个),当然也可以设置3、4...,这是实现陈列式布局的关键
        recyclerView.setLayoutManager(new GridLayoutManager(context,2));
        initData();
        return view;
    }

    public void initData(){
        videoList.add("test1");
        videoList.add("test2");
        videoList.add("test3");
        //myAdapter.notifyDataSetChanged();
    }
    public void setItemSpace(){//调整item的上下左右的间距大小
        RecyclerView.ItemDecoration decoration=new RecyclerView.ItemDecoration() {
            @Override
            public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent,
                                       @NonNull RecyclerView.State state) {
                super.getItemOffsets(outRect, view, parent, state);
                if (parent.getChildLayoutPosition(view) %2==0) {
                    //表示1行的第1个(标号从0开始)的左边距设置为50,
                    // 右边距设置为0,顶部和底部间距设置为10
                    outRect.left = 50;
                    outRect.right = 0;
                    outRect.top = 10;
                    outRect.bottom = 10;
                }else{//表示1行的第2个
                    outRect.left = 20;
                    outRect.right = 50;
                    outRect.top = 10;
                    outRect.bottom = 10;
                }
            }
        };
        recyclerView.addItemDecoration(decoration);
    }

    //item复制
    public class MyAdapter extends RecyclerView.Adapter<Travel_video.MyHolder>{
        Context context;

        public MyAdapter(Context context){
            this.context=context;
        }
        //加载并但会布局文件
        @NonNull
        @Override
        public Travel_video.MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            //item_video是item的id,这里需要传入它的id
            View view = LayoutInflater.from(context).inflate(R.layout.item_video,parent,false);
            return new Travel_video.MyHolder(view);
        }

        //填充布局控件
        @Override
        public void onBindViewHolder(@NonNull Travel_video.MyHolder holder, int position) {
            holder.textView1.setText(videoList.get(position));

            holder.rootView1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //这里的点击事件就是点击小框(rootView1)跳转到一个activity——video_detailsActivity
                    Intent intent= new Intent(context, video_detailsActivity.class);
                    startActivity(intent);
                }
            });
        }

        //布局复制次数
        @Override
        public int getItemCount() {
            return videoList.size();
        }
    }

    //控制布局文件的控件
    public class MyHolder extends RecyclerView.ViewHolder{
        //修改item中的text值
        TextView textView1;
        ConstraintLayout rootView1;
        public MyHolder(@NonNull View itemView) {
            super(itemView);
            textView1=itemView.findViewById(R.id.textView45);
            //rootView1是item文件中最外层的约束布局
            rootView1=itemView.findViewById(R.id.rootView1);
        }
    }
}

 五、最后:

本篇文章仅供参考,且小梁写的是比较简单的recyclerView的实现,想要实现更多功能可能更加复杂,小伙伴们自己去探索吧。加油小伙伴们!

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值