review
In the previous blog, we introduced how to use RecycleView. The first step is to download or import RecycleView-related dependencies, then get the RecycleView control, set the layout form for it, and set the adapter. Then we need to inherit RecyclerView.Adapter for the adapter class and set a generic for it (here we can define an internal class to inherit RecyclerView.ViewHolder), and pay attention to the corresponding modification in the rewrite method,
for three of them Let's take a look at the functions of methods onCreateViewHolder, onBindViewHolder, and getItemCount.
1.onCreateViewHolder creates a data source layout
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 binds data source data
//展示数据
@Override
public void onBindViewHolder(@NonNull HorAdapter.MyViewHolder holder, int position) {
holder.textView.setText("Hello ,Android");
}
3.getItemCount sets the number of separate layouts that need to be displayed
public int getItemCount() {
//需要展示的个数
return 30;
}
Set click event for recycleview
Set the click event in the onBindViewHolder method of the adapter
It should be noted that it is clicked through holder.itemView, because you can understand itemview as each layout, then you need to handle the click event for each layout
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();
}
});
}
Set click event for recycleview
Realized by callback method,
(1) Define an interface for callback in the adapter class
//定义一个接口用于回调操作
public interface OnItemClickListerner{
void onClick(int pos);
}
(2) Add interface parameters in the construction method
private Context mcontext;
private OnItemClickListerner mlisterner;
//构造方法
public HorAdapter( Context context,OnItemClickListerner listerner) {
this.mcontext=context;
this.mlisterner=listerner;
}
(3) The click event in the onBindViewHolder method drops the method mlisterner.onClick(position) in the interface;
@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) When adding an adapter in the recycleview, and set the click event processing for it
//为其设置适配器
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();
}
}));
Click event source code
Click to enter recycleviewdemo02
Recycleview with horizontal layout
The realization of the above is very simple, is
to set the direction for LinearLayoutManager based on the original code
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();
}
}));
}
}
Grid layout
The most critical point is here, the rest of the code root is the same as before, where 3 means that it is presented in three lines
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 in waterfall form
The key point is to set the StaggeredGridLayoutManager layout
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();
}
}));
}
}
In the Adapter, I made a modification to display pictures instead of text information. The code is as follows:
Note that in the onBindViewHolder method, I judged based on position. If I wear one picture for even, pass another for odd Pictures
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);
}
}