目录
step3 添加一个recyclerview_item.xml 页面
step6 java主文件里,往recyclerview里放数据
一 recyclerview基础使用(垂直布局)
1 步骤
step1 导入recyclerview 的依赖
step2 activity_main.xml
里面添加recyclerview标签
step3 添加一个recyclerview_item.xml 页面
里面添加TextView内容
step4 创建一个java bean类
step5 创建MyAdapter类
MyAdapter类继承 RecyclerView.Adapter<MyAdapter.MyViewHolder>,
里面内部类 MyViewHolder 继承 RecyclerView.ViewHolder.
重写方法获取 recyclerview_item 页面内容
1 获取recyclerview_item.xml页面
View view = View.inflate(context,R.layout.recyclerview_item,null);
2 获取textView
3 textView里面放置bean的数据
holder.textView.setText(list.get(position).getName());
step6 java主文件里,往recyclerview里放数据
1 获取recyclerView
2 建一个 ArrayList,for循环放数据
3 把recyclerView转成垂直布局
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
4 recyclerView里面setAdapter(把ArrayList的数据放进去)
recyclerView.setAdapter(new MyAdapter(list,this));
2 代码
step1 导入recyclerview 的依赖
build.gradle
//添加recyclerview 的依赖包
implementation 'androidx.recyclerview:recyclerview:1.1.0'
step2 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerV"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
step3 添加一个recyclerview_item.xml 页面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/itemV"
android:textSize="30sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
step4 创建一个java bean类
package com.example.myrecyclerview;
public class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
step5 创建MyAdapter类
package com.example.myrecyclerview;
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.List;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private List<Student> list;
private Context context;
public MyAdapter(List<Student> list, Context context) {
this.list = list;
this.context = context;
}
//创建 ViewHolder:放recyclerview_item.xml 页面组件用的
@NonNull
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//1 获取recyclerview_item.xml页面
View view = View.inflate(context,R.layout.recyclerview_item,null);
return new MyViewHolder(view);
}
//3 textView里面放置bean的数据
@Override
public void onBindViewHolder(@NonNull MyAdapter.MyViewHolder holder, int position) {
holder.textView.setText(list.get(position).getName());
}
//recyclerview里面textView里面放了多少条数据
@Override
public int getItemCount() {
//textView里面的list为空时返回0,不为空时,返回list实际的大小
return list==null ? 0: list.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder{
//2 获取textView
private TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.itemV);
}
}
}
step6 java主文件里,往recyclerview里放数据
package com.example.myrecyclerview;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<Student> list = new ArrayList<Student>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//添加数据到list里
for (int i = 0; i < 12; i++) {
Student bean = new Student();
bean.setName("学生"+i);
list.add(bean);
}
RecyclerView recyclerView = findViewById(R.id.recyclerV);
//把recyclerView转成垂直布局
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
//context 就是 Android 组件的环境
recyclerView.setAdapter(new MyAdapter(list,this));
}
}
效果
二 把recyclerView转成网格布局
MainActivity.java
//把recyclerView转成网格布局
//第2个参数表示网格的列数
GridLayoutManager gridLayoutManager = new GridLayoutManager(this,4);
recyclerView.setLayoutManager(gridLayoutManager);
效果
三 把recyclerView转成瀑布流布局
MainActivity.java
//把recyclerView转成瀑布流布局
//第1个参数表示一行的列数,第2个参数表示方向
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
效果
四 添加点击事件获取position
recyclerview 没有点击监听,需要自己去设置
1 步骤
第一步 MyAdapter.java里
1 在MyAdapter里自定义一个监听接口,里面写点击方法(参数传position)
2 把这个自定义接口添加成MyAdapter的属性,并设置set方法
3 获取recyclerview_item.xml 页面的textView的时候,设置当textView被点击的时候,调自定义接口的点击方法,把获取的位置通过自定义监听接口点击方法的参数传走
第二步 MainActivity.java里
调用myAdapter的自定义接口的 set方法,参数:(传new自定义的接口,并实现接口里的方法)
总结:TextView有点击监听,TextView点击的时候,可以获取到position,把这个position作为自定义接口点击方法的参数传走,当MyAdapter调用自定义接口的点击方法时就获得了position,最后myAdapter被setAdapter到recyclerView里了
2 点击事件获取position的代码
MyAdapter.java
//自定义监听
private onRecyclerItemClickListener monRecyclerItemClickListener;
public void setMonRecyclerItemClickListener(onRecyclerItemClickListener listener) {
this.monRecyclerItemClickListener = listener;
}
public interface onRecyclerItemClickListener{
void onRecyclerItemClick(int position);
}
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.itemV);
//设置自定义监听
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(monRecyclerItemClickListener!=null){
monRecyclerItemClickListener.onRecyclerItemClick(getAdapterPosition());
}
}
});
}
MainActivity.java
//点击事件
myAdapter.setMonRecyclerItemClickListener(new MyAdapter.onRecyclerItemClickListener(){
@Override
public void onRecyclerItemClick(int position) {
Log.e("cs","hello, recycler"+position);
}
});
效果
3 点击事件两个文件的完整代码
MyAdapter.java
package com.example.myrecyclerview;
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.List;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private List<Student> list;
private Context context;
public MyAdapter(List<Student> list, Context context) {
this.list = list;
this.context = context;
}
//创建 ViewHolder:放recyclerview_item.xml 页面组件用的
@NonNull
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//1 获取recyclerview_item.xml页面
View view = View.inflate(context,R.layout.recyclerview_item,null);
return new MyViewHolder(view);
}
//3 textView里面放置bean的数据
@Override
public void onBindViewHolder(@NonNull MyAdapter.MyViewHolder holder, int position) {
holder.textView.setText(list.get(position).getName());
}
//recyclerview里面textView里面放了多少条数据
@Override
public int getItemCount() {
//textView里面的list为空时返回0,不为空时,返回list实际的大小
return list==null ? 0: list.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder{
//2 获取textView
private TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.itemV);
//设置自定义监听
//当点击itemView时,触发onClick方法
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(monRecyclerItemClickListener!=null){
//调用自定义接口的方法
monRecyclerItemClickListener.onRecyclerItemClick(getAdapterPosition());
}
}
});
}
}
//自定义监听
//自定义接口的对象
private onRecyclerItemClickListener monRecyclerItemClickListener;
public void setMonRecyclerItemClickListener(onRecyclerItemClickListener listener) {
monRecyclerItemClickListener = listener;
}
//自定义一个接口
public interface onRecyclerItemClickListener{
void onRecyclerItemClick(int position);
}
}
MainActivity.java
package com.example.myrecyclerview;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.LinearLayout;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<Student> list = new ArrayList<Student>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//添加数据到list里
for (int i = 0; i < 12; i++) {
Student bean = new Student();
bean.setName("学生"+i);
list.add(bean);
}
RecyclerView recyclerView = findViewById(R.id.recyclerV);
//把recyclerView转成垂直布局
// LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
// recyclerView.setLayoutManager(linearLayoutManager);
//把recyclerView转成网格布局
//第2个参数表示网格的列数
GridLayoutManager gridLayoutManager = new GridLayoutManager(this,4);
recyclerView.setLayoutManager(gridLayoutManager);
//把recyclerView转成瀑布流布局
//第1个参数表示一行的列数,第2个参数表示方向
// StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
// recyclerView.setLayoutManager(staggeredGridLayoutManager);
//context 就是 Android 组件的环境
MyAdapter myAdapter = new MyAdapter(list,this);
recyclerView.setAdapter(myAdapter);
//点击事件
myAdapter.setMonRecyclerItemClickListener(new MyAdapter.onRecyclerItemClickListener(){
@Override
public void onRecyclerItemClick(int position) {
Log.e("cs","hello, recycler"+position);
}
});
}
}