recycleview

Recyclerview

2020-03-07  本文已影响0人  嘿_叫我小王

首先,看一下效果图


recyclerview.png

和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);

穿插一个简单面试题,简述接口回调的使用思路?

  1. 在要传递数据的类中 定义接口
//事件监听
    public interface MyClickListener {
        void setOnClickListener(int i);
        void setOnLongClickListener(int i);
    }
  1. 以该接口为数据类型 定义成员变量
private MyClickListener myClickListener;
  1. 给该变量 定义 set 方法
 public void setMyClickListener(MyClickListener myClickListener) {
        this.myClickListener=myClickListener;
    }
  1. 在要传递数据的监听中 使用接口对象调用接口方法
holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myClickListener.setOnClickListener(position);
            }
        });
  1. 在要使用数据的类中调用 接口的 set(参数) 方法(参数可以是 1 this 2匿名实现类对象 3定义一个类实现接口 使用该类对象)
 rvAdapter.setMyClickListener(this);

今天的文章就到这里了。

上一篇下一篇

猜你喜欢

热点阅读