Android开发——RecyclerView

适配器:

package com.example.myapplication;

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.ArrayList;

public class MyAdapter_rv extends RecyclerView.Adapter<MyAdapter_rv.MyViewHolder>{
    private ArrayList<bean> data;
    private Context context;
    public MyAdapter_rv(ArrayList<bean> data,Context context)
    {
        this.data=data;
        this.context=context;
    }
    public MyAdapter_rv(@NonNull Context context) {
        super();
    }
    @NonNull
    @Override
    public MyAdapter_rv.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = View.inflate(context,R.layout.item,null);
        return new MyViewHolder(view);
    }
    @Override
    public void onBindViewHolder(@NonNull MyAdapter_rv.MyViewHolder holder, int position) {
        holder.tv.setText(data.get(position).getName());
    }

    @Override
    public int getItemCount() {
        return data == null ? 0 :data.size();
    }
    public class MyViewHolder extends RecyclerView.ViewHolder{
        private TextView tv;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            tv = itemView.findViewById(R.id.tv);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(mOnItemClickListener!=null)
                    {
                        mOnItemClickListener.onRecyclerItemClick(getAdapterPosition());
                    }
                }
            }
            );
        }
    }
    private OnRecyclerItemClickListener mOnItemClickListener;
    public void setRecyclerItemClickListener(OnRecyclerItemClickListener listener)
    {
        mOnItemClickListener = listener;
    }
    public interface OnRecyclerItemClickListener
    {
        void onRecyclerItemClick(int position);
    }
}
  1. 构造方法:

    第一个构造方法用于传入数据源和上下文对象。第二个构造方法是默认的构造方法,没有参数。
  2. onCreateViewHolder()方法:

    该方法用于创建ViewHolder对象,即为RecyclerView中的每个数据项创建视图。在该方法中,通过LayoutInflater将item布局文件实例化为View对象,并传入RecyclerView的父布局中。
  3. onBindViewHolder()方法:

    该方法用于绑定ViewHolder和数据,将数据显示在RecyclerView的每个Item上。在该方法中,通过ViewHolder对象获取到对应的TextView,并设置其文本内容为数据源中对应位置的数据。
  4. getItemCount()方法:

    该方法返回数据源的大小,即RecyclerView需要显示的数据项数量。
  5. MyViewHolder内部类:

    该类是ViewHolder的定义,用于保存每个Item的视图。在构造方法中,获取到Item布局文件中的TextView,并设置点击事件监听器。
  6. OnRecyclerItemClickListener接口:

    该接口定义了RecyclerView的点击事件监听方法。
  7. setRecyclerItemClickListener()方法:

    该方法用于设置RecyclerView的点击事件监听器。

mainActivity.java

package com.example.myapplication;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;

import java.util.ArrayList;
import java.util.GregorianCalendar;

public class MainActivity extends AppCompatActivity {
    private final ArrayList<bean> data = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        for(int i=0;i<100;i++)
        {
            bean bn = new bean();
            bn.setName("WJH"+i);
            data.add(bn);
        }

        RecyclerView recyclerView = findViewById(R.id.rv);
        //LinearLayoutManager linearLayoutManager =new LinearLayoutManager(this);
        // recyclerView.setLayoutManager(linearLayoutManager); 垂直布局

        //GridLayoutManager gridLayoutManager = new GridLayoutManager(this,3);
        //recyclerView.setLayoutManager(gridLayoutManager); 网格布局

        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL);
        recyclerView.setLayoutManager(staggeredGridLayoutManager); //瀑布流格式

        MyAdapter_rv myAdapter_rv = new MyAdapter_rv(data,this);
        recyclerView.setAdapter(myAdapter_rv);
        myAdapter_rv.setRecyclerItemClickListener(new MyAdapter_rv.OnRecyclerItemClickListener() {
            @Override
            public void onRecyclerItemClick(int position) {
                // 点击的方法
            }
        });
    }

}
  1. 设置全屏显示:

    使用了EdgeToEdge.enable(this)方法,将应用程序的界面延伸到屏幕的边缘,实现全屏显示效果。
  2. 设置窗口填充:

    使用了ViewCompat.setOnApplyWindowInsetsListener()方法,动态地设置了主布局的padding,以适应系统状态栏和导航栏的高度,确保内容不被遮挡。
  3. 准备数据源:

    使用一个ArrayList来存储数据,即ArrayList<bean> data
  4. 初始化RecyclerView:

    获取到RecyclerView的实例,并设置布局管理器。选择了StaggeredGridLayoutManager作为布局管理器,以实现瀑布流格式的布局,其中new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL)表示每行显示3列,布局方向为垂直。创建了自定义的RecyclerView适配器MyAdapter_rv的实例,并设置到RecyclerView上。通过setRecyclerItemClickListener()方法设置了RecyclerView的点击事件监听器。
  5. 数据源准备:

    通过循环向数据源ArrayList中添加了100个数据项,每个数据项都是一个bean对象,其中bean对象可能是应用程序自定义的一个类,用于封装某种数据。

和ListView的区别

  1. 灵活性:

    RecyclerView 更加灵活,可以通过设置不同的布局管理器实现不同的布局方式,如线性布局、网格布局、瀑布流布局等。而 ListView 只能实现垂直方向的线性布局。
  2. 性能优化:

    RecyclerView 的性能优于 ListView,特别是在数据量较大或需要频繁刷新的情况下。RecyclerView 实现了 ViewHolder 模式和局部刷新机制,可以提高列表的滚动性能和内存使用效率。
  3. 动画支持:

    RecyclerView 内置了对列表项的添加、删除和移动等操作的动画支持,可以方便地实现各种列表动画效果,而 ListView 则相对简单,实现列表动画需要自己处理。
  4. ViewHolder 模式:

    RecyclerView 中,需要显式地实现 ViewHolder 模式,即通过创建一个 ViewHolder 类来缓存视图项的子视图,以提高列表的滚动效率。而 ListView 中,虽然也可以使用 ViewHolder 模式,但在使用上没有 RecyclerView 那么灵活。
  5. 扩展性:

    RecyclerView 的适配器(Adapter)类中提供了更多的回调方法和内部类,使得开发者能够更灵活地定制列表的行为和样式。相比之下,ListView 的适配器类相对简单,扩展性较差。

 

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值