概述
RecyclerView能够灵活实现大数据集的展示,视图的复用管理比ListView更好,能够显示列表、网格、瀑布流等形式,且不同的ViewHolder能够实现item多元化的功能。
但是肯定会复杂一点。
使用前需要引入RecyclerView的依赖包
这是它的Adapter注意有一个泛型,就是ViewHolder
基本使用:
<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"
android:id="@+id/myLinearRecycleView"
android:layout_height="wrap_content">
</androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
单个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">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:id="@+id/linear_view_item"
android:text="hello"
android:background="@color/huise"
android:textSize="30sp"
android:layout_height="wrap_content"></TextView>
<TextView
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:id="@+id/linear_age_item"
android:text="12"
android:background="@color/huise"
android:textSize="30sp"
android:layout_height="wrap_content"></TextView>
</LinearLayout>
</LinearLayout>
Adapter
public class LinearAdapter extends RecyclerView.Adapter<LinearAdapter.LinearViewHolder> {
public List<User> data;
public Context context;
public LinearAdapter(Context context, List<User> data) {
this.data=data;
this.context = context;
}
@Override//创建ViewHolder
public LinearViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//返回ViewHolder,构造方法里面写一个View,也就是表示每一个item长什么样子的
return new LinearViewHolder(LayoutInflater.from(context).inflate(R.layout.layout_linear_item,parent,false));
}
@Override//绑定数据
public void onBindViewHolder(LinearAdapter.LinearViewHolder holder, int position) {
holder.name.setText(data.get(position).name);
holder.age.setText(String.valueOf(data.get(position).age));
}
@Override
public int getItemCount() {
return data==null?0:data.size();
}
//ViewHolder的类
final class LinearViewHolder extends RecyclerView.ViewHolder{
private TextView name;
private TextView age;
//构造方法,参数即此ViewHolder所要携带的item
public LinearViewHolder(View itemView) {
super(itemView);
//在创建的item布局中找到里面的元素
name =itemView.findViewById(R.id.linear_view_item);
age=itemView.findViewById(R.id.linear_age_item);
//间接的设置监听方法
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mlistener!=null) {
mlistener.onRecycleItemClick(getAdapterPosition());
}
}
});
}
}
//接口的对象
public OnRecyclerItemListener mlistener=null;
//设置
public void setMlistener(OnRecyclerItemListener listener){
mlistener=listener;
}
//给item设置设置事件的接口
public interface OnRecyclerItemListener{
void onRecycleItemClick(int position);
}
}
放Adapter的容器
public class RecycleViewActivity extends AppCompatActivity {
RecyclerView recyclerView;
List<User> data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycle_view);
data=new ArrayList<>();
for (int i = 0; i < 100; i++) {
data.add(new User(i+"号",i));
}
recyclerView=findViewById(R.id.myLinearRecycleView);
//LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager
recyclerView.setLayoutManager(new LinearLayoutManager(this));
LinearAdapter adapter = new LinearAdapter(this, data);
adapter.setMlistener(new LinearAdapter.OnRecyclerItemListener() {
@Override
public void onRecycleItemClick(int position) {
System.out.println(position+"被点击了");
}
});
//画分割线
// recyclerView.addItemDecoration(new MyDecoration());
recyclerView.setAdapter(adapter);
}
}
实现不同的类型展示不同的效果:
先看onBindViewHolder方法中的参数viewType,是它的类型
多实现一个方法
改写