Recyclerview
2020-03-07 本文已影响0人
嘿_叫我小王
首先,看一下效果图

和ListView的区别
我们为什么要用recyclerview,因为他比listview好用,它的功能更强大
那他们究竟有什么区别呢?
1.recyclerView 需要设置布局管理器,可以实现多种布局样式的管理,而listview只能是列表样式(只能在垂直方向上滚动)。
LinearLayoutManager ,可以支持水平和竖直方向上滚动的列表。
GridLayoutManager ,支持网格展示,可以水平或者竖直滚动,如展示图片的画廊。
2.recyclerView没有自己的点击监听器,而Listview 有多种监听器。
3.在ListView中如果我们想要在item之间添加间隔符,我们只需要在布局文件中对ListView添加属性(divider),RecyclerView在默认情况下并不在item之间展示间隔符,你必须使用RecyclerView.ItemDecoration类来实现
如何使用
1.在build.gradle添加依赖
//依赖
implementation 'com.android.support:recyclerview-v7:29.0.0'
2.在Activity布局中加入recyclerview
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
3.在Activity找到recyclerview
private void initView() {
mRv = (RecyclerView) findViewById(R.id.rv);
//设置布局管理器
mRv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
//设置数据
list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
list.add("text" + i);
}
//绑定适配器
rvAdapter = new RvAdapter(list, this);
mRv.setAdapter(rvAdapter);
//来个分割线
mRv.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
//接口回调的操作
rvAdapter.setMyClickListener(this);
}
4.写适配器之前,先写条目的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="vertical">
<TextView
android:id="@+id/rv_item_tv"
android:layout_width="match_parent"
android:layout_height="50dp" />
</LinearLayout>
5.写适配器RvAdapter
public class RvAdapter extends RecyclerView.Adapter<RvAdapter.MyViewHolder> {
private List<String> myList;
private Context context;
//构造方法 传递数据
public RvAdapter(ArrayList<String> list, Context context) {
myList = list;
this.context = context;
}
//接口回调
private MyClickListener myClickListener;
public void setMyClickListener(MyClickListener myClickListener) {
this.myClickListener=myClickListener;
}
@NonNull
@Override
//绑定布局
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rv_item, parent, false);
MyViewHolder myViewHolder = new MyViewHolder(view);
return myViewHolder;
}
@Override
//设置数据
public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
TextView textView = holder.itemView.findViewById(R.id.rv_item_tv);
textView.setText(myList.get(position));
//对条目设置监听
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myClickListener.setOnClickListener(position);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
myClickListener.setOnLongClickListener(position);
return false;
}
});
}
@Override
//获取条目数量
public int getItemCount() {
return myList.size();
}
//定义视图管理器
class MyViewHolder extends RecyclerView.ViewHolder {
public MyViewHolder(@NonNull View itemView) {
super(itemView);
}
}
//事件监听
public interface MyClickListener {
void setOnClickListener(int i);
void setOnLongClickListener(int i);
}
}
6.因为里面有监听,所以需要让activity首先RvAdapter.MyClickListener接口,重写方法
@Override
public void setOnClickListener(int i) {
Toast.makeText(this, "点击" + i, Toast.LENGTH_SHORT).show();
}
@Override
public void setOnLongClickListener(int i) {
Toast.makeText(this, "长按" + i, Toast.LENGTH_SHORT).show();
}
最后记得不要忘记调用 接口的 set 方法,传递参数!!!
//接口回调重要
rvAdapter.setMyClickListener(this);
穿插一个简单面试题,简述接口回调的使用思路?
- 在要传递数据的类中 定义接口
//事件监听
public interface MyClickListener {
void setOnClickListener(int i);
void setOnLongClickListener(int i);
}
- 以该接口为数据类型 定义成员变量
private MyClickListener myClickListener;
- 给该变量 定义 set 方法
public void setMyClickListener(MyClickListener myClickListener) {
this.myClickListener=myClickListener;
}
- 在要传递数据的监听中 使用接口对象调用接口方法
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myClickListener.setOnClickListener(position);
}
});
- 在要使用数据的类中调用 接口的 set(参数) 方法(参数可以是 1 this 2匿名实现类对象 3定义一个类实现接口 使用该类对象)
rvAdapter.setMyClickListener(this);
今天的文章就到这里了。