Android recyclerview垂直布局、网格布局、瀑布流布局、点击事件获取位置的使用

目录

一 recyclerview基础使用(垂直布局)

1 步骤

2 代码

step1 导入recyclerview 的依赖

 step2 activity_main.xml 

step3 添加一个recyclerview_item.xml 页面

step4 创建一个java bean类

step5 创建MyAdapter类

step6 java主文件里,往recyclerview里放数据

 二 把recyclerView转成网格布局

 三 把recyclerView转成瀑布流布局

 四 添加点击事件获取position

1 步骤

2 点击事件获取position的代码

 3 点击事件两个文件的完整代码


一 recyclerview基础使用(垂直布局)

1 步骤

step1 导入recyclerview 的依赖

step2 activity_main.xml 
    里面添加recyclerview标签    
    
step3 添加一个recyclerview_item.xml 页面
    里面添加TextView内容    
    
step4 创建一个java bean类

step5 创建MyAdapter类
MyAdapter类继承 RecyclerView.Adapter<MyAdapter.MyViewHolder>,
里面内部类 MyViewHolder 继承 RecyclerView.ViewHolder.
重写方法获取 recyclerview_item 页面内容
    1 获取recyclerview_item.xml页面
        View view = View.inflate(context,R.layout.recyclerview_item,null);
    2 获取textView    
    3 textView里面放置bean的数据    
        holder.textView.setText(list.get(position).getName());
          
step6 java主文件里,往recyclerview里放数据
    1 获取recyclerView
    2 建一个 ArrayList,for循环放数据
    3 把recyclerView转成垂直布局
         LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
            recyclerView.setLayoutManager(linearLayoutManager);
            
    4 recyclerView里面setAdapter(把ArrayList的数据放进去)
        recyclerView.setAdapter(new MyAdapter(list,this));

2 代码

step1 导入recyclerview 的依赖

build.gradle

//添加recyclerview 的依赖包
    implementation 'androidx.recyclerview:recyclerview:1.1.0'

 step2 activity_main.xml 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerV"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>



</LinearLayout>

step3 添加一个recyclerview_item.xml 页面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/itemV"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>


</LinearLayout>

step4 创建一个java bean类

package com.example.myrecyclerview;

public class Student {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

step5 创建MyAdapter类

package com.example.myrecyclerview;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    private List<Student> list;
    private Context context;


    public MyAdapter(List<Student> list, Context context) {
        this.list = list;
        this.context = context;
    }

    //创建 ViewHolder:放recyclerview_item.xml 页面组件用的
    @NonNull
    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //1 获取recyclerview_item.xml页面
        View view = View.inflate(context,R.layout.recyclerview_item,null);
        return new MyViewHolder(view);
    }

    //3 textView里面放置bean的数据
    @Override
    public void onBindViewHolder(@NonNull MyAdapter.MyViewHolder holder, int position) {
        holder.textView.setText(list.get(position).getName());
    }

    //recyclerview里面textView里面放了多少条数据
    @Override
    public int getItemCount() {
        //textView里面的list为空时返回0,不为空时,返回list实际的大小
        return list==null ? 0: list.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder{
        //2 获取textView
        private TextView textView;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.itemV);
        }
    }
}

step6 java主文件里,往recyclerview里放数据

package com.example.myrecyclerview;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.ListView;

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

public class MainActivity extends AppCompatActivity {

    private List<Student> list = new ArrayList<Student>();


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

            //添加数据到list里
            for (int i = 0; i < 12; i++) {
                Student bean  = new Student();
                bean.setName("学生"+i);
                list.add(bean);
            }
            RecyclerView recyclerView = findViewById(R.id.recyclerV);
            //把recyclerView转成垂直布局
            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
            recyclerView.setLayoutManager(linearLayoutManager);

            //context 就是 Android 组件的环境
            recyclerView.setAdapter(new MyAdapter(list,this));


    }
}

效果

 二 把recyclerView转成网格布局

MainActivity.java

//把recyclerView转成网格布局
//第2个参数表示网格的列数
GridLayoutManager gridLayoutManager = new GridLayoutManager(this,4);
recyclerView.setLayoutManager(gridLayoutManager);

效果

 三 把recyclerView转成瀑布流布局

MainActivity.java

//把recyclerView转成瀑布流布局
//第1个参数表示一行的列数,第2个参数表示方向
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);

效果

 四 添加点击事件获取position

recyclerview 没有点击监听,需要自己去设置

1 步骤

第一步 MyAdapter.java里
1 在MyAdapter里自定义一个监听接口,里面写点击方法(参数传position)
2 把这个自定义接口添加成MyAdapter的属性,并设置set方法
3 获取recyclerview_item.xml 页面的textView的时候,设置当textView被点击的时候,调自定义接口的点击方法,把获取的位置通过自定义监听接口点击方法的参数传走

第二步 MainActivity.java里
调用myAdapter的自定义接口的 set方法,参数:(传new自定义的接口,并实现接口里的方法)

总结:TextView有点击监听,TextView点击的时候,可以获取到position,把这个position作为自定义接口点击方法的参数传走,当MyAdapter调用自定义接口的点击方法时就获得了position,最后myAdapter被setAdapter到recyclerView里了

2 点击事件获取position的代码

MyAdapter.java

  //自定义监听
    private onRecyclerItemClickListener monRecyclerItemClickListener;

    public void setMonRecyclerItemClickListener(onRecyclerItemClickListener listener) {
        this.monRecyclerItemClickListener = listener;
    }

    public interface onRecyclerItemClickListener{
        void onRecyclerItemClick(int position);
    }
    
     public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.itemV);
            //设置自定义监听
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(monRecyclerItemClickListener!=null){
                        monRecyclerItemClickListener.onRecyclerItemClick(getAdapterPosition());
                    }

                }
           });
        }

MainActivity.java

 //点击事件
            myAdapter.setMonRecyclerItemClickListener(new MyAdapter.onRecyclerItemClickListener(){
                @Override
                public void onRecyclerItemClick(int position) {
              
                    Log.e("cs","hello, recycler"+position);
                }
            });

效果

 3 点击事件两个文件的完整代码

MyAdapter.java

package com.example.myrecyclerview;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    private List<Student> list;
    private Context context;


    public MyAdapter(List<Student> list, Context context) {
        this.list = list;
        this.context = context;
    }

    //创建 ViewHolder:放recyclerview_item.xml 页面组件用的
    @NonNull
    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //1 获取recyclerview_item.xml页面
        View view = View.inflate(context,R.layout.recyclerview_item,null);
        return new MyViewHolder(view);
    }

    //3 textView里面放置bean的数据
    @Override
    public void onBindViewHolder(@NonNull MyAdapter.MyViewHolder holder, int position) {
        holder.textView.setText(list.get(position).getName());
    }

    //recyclerview里面textView里面放了多少条数据
    @Override
    public int getItemCount() {
        //textView里面的list为空时返回0,不为空时,返回list实际的大小
        return list==null ? 0: list.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder{
        //2 获取textView
        private TextView textView;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.itemV);
            //设置自定义监听
            //当点击itemView时,触发onClick方法
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(monRecyclerItemClickListener!=null){
                        //调用自定义接口的方法
                        monRecyclerItemClickListener.onRecyclerItemClick(getAdapterPosition());
                    }

                }
            });
        }
    }

    //自定义监听
    //自定义接口的对象
    private onRecyclerItemClickListener monRecyclerItemClickListener;

    public void setMonRecyclerItemClickListener(onRecyclerItemClickListener listener) {
        monRecyclerItemClickListener = listener;
    }

    //自定义一个接口
    public interface onRecyclerItemClickListener{
        void onRecyclerItemClick(int position);
    }
}

MainActivity.java

package com.example.myrecyclerview;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;

import android.os.Bundle;
import android.util.Log;
import android.widget.LinearLayout;
import android.widget.ListView;

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

public class MainActivity extends AppCompatActivity {

    private List<Student> list = new ArrayList<Student>();


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

            //添加数据到list里
            for (int i = 0; i < 12; i++) {


                Student bean  = new Student();
                bean.setName("学生"+i);
                list.add(bean);
            }
            RecyclerView recyclerView = findViewById(R.id.recyclerV);
            //把recyclerView转成垂直布局
//            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
//            recyclerView.setLayoutManager(linearLayoutManager);

            //把recyclerView转成网格布局
            //第2个参数表示网格的列数
            GridLayoutManager gridLayoutManager = new GridLayoutManager(this,4);
            recyclerView.setLayoutManager(gridLayoutManager);

            //把recyclerView转成瀑布流布局
            //第1个参数表示一行的列数,第2个参数表示方向
//            StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
//            recyclerView.setLayoutManager(staggeredGridLayoutManager);


            //context 就是 Android 组件的环境

            MyAdapter myAdapter =  new MyAdapter(list,this);
            recyclerView.setAdapter(myAdapter);

            //点击事件
            myAdapter.setMonRecyclerItemClickListener(new MyAdapter.onRecyclerItemClickListener(){
                @Override
                public void onRecyclerItemClick(int position) {

                    Log.e("cs","hello, recycler"+position);
                }
            });



    }
}

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值