RecycleView小白入门详解(二)(教你全面掌握其用法)

回顾

上前一个博客中,我们介绍到如何使用RecycleView,第一步先要去下载或导入RecycleView相关的依赖,然后获取RecycleView控件,并为其设置布局形式,以及设置适配器。然后我们需要对适配器类继承 RecyclerView.Adapter,并为其设置泛型(这里的泛型我们可以定义一个内部类继承RecyclerView.ViewHolder),并注意在重写方法中进行相应修改,
对于其中的三个方法onCreateViewHolder,onBindViewHolder,getItemCount的作用我们来了解一下。

1.onCreateViewHolder创建数据源布局

  public HorAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
    
        //传入一个item布局
            return new MyViewHolder(LayoutInflater.from(mcontext).inflate(R.layout.hor_item,parent,false));
    }

2.onBindViewHolder绑定数据源数据

//展示数据
    @Override
    public void onBindViewHolder(@NonNull HorAdapter.MyViewHolder holder, int position) {
    
    
holder.textView.setText("Hello ,Android");
    }

3.getItemCount设置需要展示的单独布局的个数

  public int getItemCount() {
    
    
        //需要展示的个数
        return 30;
    }

为recycleview设置点击事件

在适配器的onBindViewHolder方法中设置点击事件

需要注意的是是通过holder.itemView来点击的,因为itemview你可以把它理解成每一个布局,那么就需要对每一个布局进行点击事件的处理

 public void onBindViewHolder(@NonNull HorAdapter.MyViewHolder holder, final int position) {
    
    
holder.textView.setText("Hello ,Android");
holder.itemView.setOnClickListener(new View.OnClickListener() {
    
    
    @Override
    public void onClick(View view) {
    
    
        Toast.makeText(mcontext,"你点击了"+position,Toast.LENGTH_SHORT).show();
    }
});
    }

为recycleview设置点击事件

通过回调方法来实现,
(1)在适配器类定义一个接口用于回调

    //定义一个接口用于回调操作
  public  interface  OnItemClickListerner{
    
    
        void onClick(int pos);
  }

(2)在构造方法中添加接口参数

private Context mcontext;
    private  OnItemClickListerner mlisterner;
    //构造方法
    public HorAdapter( Context context,OnItemClickListerner listerner) {
    
    
        this.mcontext=context;
        this.mlisterner=listerner;
    }

(3)在onBindViewHolder方法中的点击事件掉接口中的方法mlisterner.onClick(position);

    @Override
    public void onBindViewHolder(@NonNull HorAdapter.MyViewHolder holder, final int position) {
    
    
holder.textView.setText("Hello ,Android");
holder.itemView.setOnClickListener(new View.OnClickListener() {
    
    
    @Override
    public void onClick(View view) {
    
    
     mlisterner.onClick(position);
    }
});

(4)在recycleview添加适配器的时候,并为其设置点击事件的处理

 //为其设置适配器
        hor_recycle.setAdapter(new HorAdapter(HorRecycleActivity.this, new HorAdapter.OnItemClickListerner() {
    
    
            @Override
            public void onClick(int pos) {
    
    
                Toast.makeText(HorRecycleActivity.this,"你点击了"+pos,Toast.LENGTH_SHORT).show();
            }
        }));

点击事件的源码

点入进入recycleviewdemo02

水平布局的recycleview

在这里插入图片描述
实现上述很简单,就是在原来的代码基础上
为LinearLayoutManager设置方向

  linearLayoutManager.setOrientation(RecyclerView.HORIZONTAL);
public class VerRecycleActivity extends AppCompatActivity {
    
    
    public RecyclerView recyclerView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ver_recycle);
        recyclerView=findViewById(R.id.recyclerView);
        LinearLayoutManager linearLayoutManager=new LinearLayoutManager(VerRecycleActivity.this);
        linearLayoutManager.setOrientation(RecyclerView.HORIZONTAL);
        recyclerView.setLayoutManager( linearLayoutManager);
        recyclerView.setAdapter(new VerAdapter(VerRecycleActivity.this, new VerAdapter.OnItemClickListerner() {
    
    
            @Override
            public void onClick(int pos) {
    
    
                Toast.makeText(VerRecycleActivity.this,"你点击了"+pos,Toast.LENGTH_SHORT).show();
            }
        }));
    }
}

网格布局

在这里插入图片描述

最关键的点在此,其余代码根原来一样,这里的3表示以三行形式呈现

   recyclerView.setLayoutManager(new GridLayoutManager(GirdRecycleActivity.this,3));
public class GirdRecycleActivity extends AppCompatActivity {
    
    
private RecyclerView recyclerView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gird_recycle);
        recyclerView=findViewById(R.id.recyclerView2);
        //为网格布局
        recyclerView.setLayoutManager(new GridLayoutManager(GirdRecycleActivity.this,3));
        //为其设置适配器
       recyclerView.setAdapter(new GridAdapter(GirdRecycleActivity.this, new GridAdapter.OnItemClickListerner() {
    
    
           @Override
           public void onClick(int pos) {
    
    
               Toast.makeText(GirdRecycleActivity.this,"你点击了"+pos,Toast.LENGTH_SHORT).show();
           }
       }));
    }
}

瀑布流形式的RecycleView

在这里插入图片描述
关键点是设置StaggeredGridLayoutManager 布局

   StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);

public class WaterFallActivity extends AppCompatActivity {
    
    
private RecyclerView recyclerView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_water_fall);
        recyclerView=findViewById(R.id.recyclerView3);
        //瀑布流布局,2表示展示2列,后面的参数为水平展示还是垂直展示
        StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(staggeredGridLayoutManager);
        recyclerView.setAdapter(new WaterAdapter(WaterFallActivity.this, new WaterAdapter.OnItemClickListerner() {
    
    
            @Override
            public void onClick(int pos) {
    
    
                Toast.makeText(WaterFallActivity.this,"你点击了"+pos,Toast.LENGTH_SHORT).show();
            }
        }));

    }
}

在Adapter里面我做了修改,用来展示图片了,而不是文字信息,代码如下:
注意的是在onBindViewHolder方法中我根据position做了判断,如果为偶穿一张图片,为奇传入另一张图片

public class WaterAdapter extends RecyclerView.Adapter<WaterAdapter.MyViewHolder> {
    
    
    private Context mcontext;
    private  OnItemClickListerner mlisterner;
    //构造方法
    public WaterAdapter( Context context,OnItemClickListerner listerner) {
    
    
        this.mcontext=context;
        this.mlisterner=listerner;
    }

    @NonNull
    @Override
    public WaterAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    
    
        //传入一个item布局
        return new MyViewHolder(LayoutInflater.from(mcontext).inflate(R.layout.water_item,parent,false));
    }
    //展示数据
    @Override
    public void onBindViewHolder(@NonNull WaterAdapter.MyViewHolder holder, final int position) {
    
    
        //偶数设置Android图片
        if(position %2 == 0){
    
    
        holder.imageView.setImageResource(R.drawable.android);}
        else{
    
    
            //奇数设置Android图片
            holder.imageView.setImageResource(R.drawable.android02);
        }
        holder.itemView.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View view) {
    
    
                mlisterner.onClick(position);
            }
        });
    }

    @Override
    public int getItemCount() {
    
    
        //需要展示的个数
        return 30;
    }
    //需要定义一个内部类继承ViewHolder
    class  MyViewHolder extends RecyclerView.ViewHolder {
    
    
        private ImageView imageView;
        public MyViewHolder(@NonNull View itemView) {
    
    
            super(itemView);
            //注意这里是通过itemView来找,而不是R,因为我们的textView是在itemView里面的
            imageView=itemView.findViewById(R.id.imageView);
        }
    }
    //定义一个接口用于回调操作
    public  interface  OnItemClickListerner{
    
    
        void onClick(int pos);
    }

}

完整代码

recycleview布局展示的完整代码

猜你喜欢

转载自blog.csdn.net/qq_45353823/article/details/107726723