初识RecyclerView
RecyclerView是android5.0之后推出的用于展示大量数据的空间,可以用来代替传统的ListView空间,功能强大且灵活。
首先我们需要在build.gradle(app)中添加依赖包:
dependencies {
implementation 'com.android.support:recyclerview-v7:24.2.0'
}
以前使用的是compile编译,现在新版本已经替换成implementation。添加这一一条依赖之后,点击sync project with gradle file同步就可以了。(这条依赖包下面可能会出现红线,但是不影响使用)。
如何使用RecyclerView
recyclerView = findViewById(R.id.recycler_view);
//找到RecyclerView的布局文件
public void setLayoutManager(@Nullable LayoutManager layout);
//设置布局管理器
public void setAdapter(@Nullable Adapter adapter);
//设置Adapter
RecyclerView的布局文件
activity_recycler.xml
LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_height="match_parent" <!--布满整个屏幕-->
android:layout_width="match_parent"
android:background="#AAAAAA">
</androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
Adapter适配器
自己写的Adapter需要继承RecyclerView.Adapter;
标准实现步骤如下:
① 创建Adapter:创建一个继承RecyclerView.Adapter的Adapter类(VH是ViewHolder的类名)
② 创建ViewHolder:在Adapter中创建一个继承RecyclerView.ViewHolder的静态内部类,记为VH。ViewHolder的实现和ListView的ViewHolder实现几乎一样。
③ 在Adapter中实现3个方法:
onCreateViewHolder()
这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder需要我们自己去编写。
RecyclerAdapter.java
package cn.com.recyclerviewtest;
import android.content.ContentProvider;
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;
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {
// private TextView textView;
private Context mContext;
public RecyclerAdapter(Context context) {
this.mContext = context;
}
@NonNull
@Override
//**生成每一个item inflate对象**
public RecyclerAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyViewHolder(LayoutInflater.from(mContext).inflate(R.layout.reccycler_item, parent, false));
}
@Override
//绑定内容
public void onBindViewHolder(@NonNull RecyclerAdapter.MyViewHolder holder, final int position) {
holder.textView.setText("Hello World!");
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
//点击事件
public void onClick(View view) {
Toast.makeText(mContext, "Click....." + position, Toast.LENGTH_SHORT ).show();
}
});
}
@Override
//展示的item数, 一般是一个容器的大小
public int getItemCount() {
return 20;
}
// holder主要用于存储每一个item的内容,重写了这个方法,要修改前面的onCreate../onBlind...的内容参数
public static class MyViewHolder extends RecyclerView.ViewHolder {
private TextView textView;
public MyViewHolder(View view) {
super(view); //view 每一个布局
textView = view.findViewById(R.id.tv_recycler_item);
}
}
}
设置显示RecyclerView
RecyclerActivity
recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(RecyclerActivity.this));
recyclerView.addItemDecoration(new MyDecoration()); //划分割线
recyclerView.setAdapter(new RecyclerAdapter(RecyclerActivity.this));
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);
outRect.set(0, 0, 0, getResources().getDimensionPixelSize(R.dimen.header_line));
}
关于分割线的内容,可以参[andro recyclerViedIIw 简单实用二–分割线https://www.cnblogs.com/xuqp/p/9798704.html
学习资料推荐天哥在奔跑的android教学视频,在B站上可以找到。