Introduction to RecycleView Xiaobai (two) (teach you to fully grasp its usage)

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

Insert picture description here
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

Insert picture description here

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

Insert picture description here
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);
    }

}

Complete code

The complete code of recycleview layout display

Guess you like

Origin blog.csdn.net/qq_45353823/article/details/107726723