RecyclerView基本用法
初识RecyclerView
RecyclerView | Android Developers
A flexible view for providing a limited window into a large data set.
根据数据集显示元素的滚动列表
RecyclerView的特点
- 优化了ListView
- ViewHolder----把view封装起来
- layoutmanager 布局管理器 控制Item的布局方式
- ItemDecoration 设置Item的间隔样式
- ItemAnimato 控制Item增删的动画
使用 RecyclerView 创建列表
添加依赖库
打开app包下的build.gradle 找到 dependencies{}
插入以下代码
implementation "androidx.recyclerview:recyclerview:1.1.0"
接着你会发现右上角出现了Sync Now字眼,我们点击他来重新Sync
依赖库的各个版本可以在官网里找到https://developer.android.com/jetpack/androidx/releases/recyclerview#declaring_dependencies
将RecyclerView添加到布局中
打开我们的activity_main.xml布局文件,将RecyclerView添加到布局中,给他命名为my_re_view
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/my_re_view"
android:scrollbars="vertical"/>
</LinearLayout>
定义一个名为TextItem的java类
新建java文件,用我们之前所学的java类与构造函数的知识定义一个实体类,定义两个变量,一个是int类型的ImageId,一个是String类型的textId
public class TextItem {
private int ImageId;
private String textId;
public TextItem(int imageId, String textId) {
ImageId = imageId;
this.textId = textId;
}
public int getImageId() {
return ImageId;
}
public void setImageId(int imageId) {
ImageId = imageId;
}
public String getTextId() {
return textId;
}
public void setTextId(String textId) {
this.textId = textId;
}
}
在这里我们为了方便,直接点击code下的generate来偷懒一下,让他自动生成构造函数和getter&setter方法
编写item子布局文件my_item
新建layout.xml文件,命名为my_item
recyclerview中的每一个子项item,因为是模仿聊天界面,所以都简化为由一个图片和一段文字组成
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_margin="5dp"
android:layout_weight="1"
android:id="@+id/image_list"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:layout_weight="3"
android:textColor="#888888"
android:id="@+id/text_list"/>
</LinearLayout>
写一个MyAdapter添加列表适配器
- 新建java文件,继承
RecyclerView.Adapter
将泛型指定为<MyAdapter.ViewHolder>
- 定义ViewHolder类,在MyAdapter中创建一个继承
RecyclerView.ViewHolder
的静态类,传入的View参数通常是RecyclerView的最外层布局 - 实现
onCreateViewHolder()
方法,把View封装在ViewHolder中,创建ViewHolder实例 - 实现
onBindViewHolder()
方法,对item数据进行赋值,获取position,即当前的TextItem实例 - 实现
getItemCount()
方法,返回item数量
package com.example.recyclervtest;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
public MyAdapter(List<TextItem> myList) {
this.myList = myList;
}
private List<TextItem> myList;
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_item , parent,false);//把我们写的my_item布局加载进来
ViewHolder holder = new ViewHolder(view);//获取整个子布局
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {//子项滚到屏幕内时执行
TextItem textItem = myList.get(position);//获取position
holder.image_list.setImageResource(textItem.getImageId());//赋值给imageview和textview
holder.text_list.setText(textItem.getTextId());
}
@Override
public int getItemCount() {
return myList.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
ImageView image_list;
TextView text_list;
//这是一个静态类 继承自RecyclerView.ViewHolder
//里面有两个变量和一个构造方法
//构造方法需要传入一个view参数
public ViewHolder(View view) {
super(view);
image_list = (ImageView) view.findViewById(R.id.image_list);
text_list = (TextView) view.findViewById(R.id.text_list);
}
}
}
修改MainActivity代码
- 绑定布局id
- 为recyclerview设置布局管理器
- 定义InitData方法,将数据添加至list里
- 将list传进MyAdapter,设置recyclerview的adapter
public class MainActivity extends AppCompatActivity {
private List<TextItem> myData = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
RecyclerView recyclerView = findViewById(R.id.my_re_view);//绑定id
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
MyAdapter adapter = new MyAdapter(myData);
recyclerView.setAdapter(adapter);
}
protected void initData(){
TextItem ti1 = new TextItem(R.drawable.pic1,"我是一只柴犬。");
myData.add(ti1);
TextItem ti2 = new TextItem(R.drawable.pic2,"柴犬最可爱啦!");
myData.add(ti2);
TextItem ti3 = new TextItem(R.drawable.pic3,"我爱柴犬!");
myData.add(ti3);
TextItem ti4 = new TextItem(R.drawable.pic4,"我是最可爱的柴犬秋菊!");
myData.add(ti4);
TextItem ti5 = new TextItem(R.drawable.pic5,"你好!我是泡芙。");
myData.add(ti5);
TextItem ti6 = new TextItem(R.drawable.pic6,"我是小短腿柯基呀!");
myData.add(ti6);
}
}
好啦!这样我们的超低配聊天页面就完成了!
版权声明:本文为wasabidragon原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。