以瀑布流为例,大体步骤是这样,其中部分步骤是交叉进行的
建activity类
- 在activity对应的布局文件中添加控件
- 在activity中定义控件,找到控件
private RecyclerView rv_sg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_stragger_grid_recycler_view);
rv_sg = findViewById(R.id.rv_sg);
}
为控件添加布局管理器
添加方法:setLayoutManager(),参数根据布局不同而不同:
//瀑布流:第二个参数表示纵向或横向,第一个参数根据第二个参数表示几行或几列
rv_sg.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));
//网格视图,表示几列
rv_grid.setLayoutManager(new GridLayoutManager(this,3));
//设置水平布局
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
rv_hor.setLayoutManager(layoutManager);
//设置纵向布局
rvLinear.setLayoutManager(new LinearLayoutManager(this));
为子项添加分割线(装饰)
rv_sg.addItemDecoration(new MyDecoration());
需要设计一个内部类 MyDecoration
class MyDecoration extends 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);
//分别设置左上右下,只需要下面的分割线,这里设置的都是int值,最后一个是设置values中布局的id。分割线的颜色是背景的颜色
outRect.set(0,0,0,getResources().getDimensionPixelOffset(R.dimen.dividerHeight));
}
添加适配器
适配器用于定义子项的布局,并可以为子项添加事件监听器
rv_sg.setAdapter(new StaggerGridAdapter(this));
- 创建适配器类:
package com.example.test.recyclerview;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.Adapter;
import com.example.test.R;
public class StaggerGridAdapter extends Adapter<StaggerGridAdapter.LinearViewHolder> {
private Context context;
public static int count = 0;
public StaggerGridAdapter(Context context) {
this.context = context;
count++;
}
@NonNull
@Override
public StaggerGridAdapter.LinearViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//返回布局
return new LinearViewHolder(LayoutInflater.from(context).inflate(R.layout.layout_staggered_grid_recycle_item,parent,false));
}
@Override
//绑定item内容
public void onBindViewHolder(@NonNull LinearViewHolder holder, final int position) {
holder.tvTitle.setText("真他么难搞啊");
//定义点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context,"点击"+position,Toast.LENGTH_SHORT).show();
}
});
//Log.d("count",count+"");
}
@Override
//返回值设置item的数量,返回多少就有多少个
public int getItemCount() {
return 10;
}
class LinearViewHolder extends RecyclerView.ViewHolder{
TextView tvTitle;
public LinearViewHolder(@NonNull View itemView) {
super(itemView);
tvTitle = itemView.findViewById(R.id.tv_title);
}
}
}
- 在创建适配器的时候回用到子项的布局文件,需要时创建即可。
- 适配器里有几个重要方法:
- 构造方法:这里面需要传进一些有用的数据并初始化,比如Context
- onCreateViewHolder();这个方法的返回值是一个自己定义的继承了viewHolder的类,也是适配器指定的泛型。它里面包装了item子项的所有控件视图。
- onBindViewHolder();
这个方法两个用处:
一是为ViewHolder里的控件绑定内容,
二是可以为item子项定义事件监听器 - getItemCount();
返回值定义了item子项的数量。