Recyclerview

首先,看一下效果圖


recyclerview.png

和ListView的區(qū)別

我們?yōu)槭裁匆胷ecyclerview,因?yàn)樗?strong>listview好用,它的功能更強(qiáng)大
那他們究竟有什么區(qū)別呢?

1.recyclerView 需要設(shè)置布局管理器,可以實(shí)現(xiàn)多種布局樣式的管理,而listview只能是列表樣式(只能在垂直方向上滾動(dòng))。
LinearLayoutManager ,可以支持水平和豎直方向上滾動(dòng)的列表。
GridLayoutManager ,支持網(wǎng)格展示,可以水平或者豎直滾動(dòng),如展示圖片的畫廊。
2.recyclerView沒有自己的點(diǎn)擊監(jiān)聽器,而Listview 有多種監(jiān)聽器。
3.在ListView中如果我們想要在item之間添加間隔符,我們只需要在布局文件中對(duì)ListView添加屬性(divider),RecyclerView在默認(rèn)情況下并不在item之間展示間隔符,你必須使用RecyclerView.ItemDecoration類來實(shí)現(xiàn)

如何使用

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);
        //設(shè)置布局管理器
        mRv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
        //設(shè)置數(shù)據(jù)
        list = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            list.add("text" + i);
        }
        //綁定適配器
        rvAdapter = new RvAdapter(list, this);
        mRv.setAdapter(rvAdapter);
        //來個(gè)分割線
        mRv.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
        //接口回調(diào)的操作
        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;
    //構(gòu)造方法 傳遞數(shù)據(jù)
    public RvAdapter(ArrayList<String> list, Context context) {
        myList = list;
        this.context = context;
    }

    //接口回調(diào)
    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
    //設(shè)置數(shù)據(jù)
    public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
        TextView textView = holder.itemView.findViewById(R.id.rv_item_tv);
        textView.setText(myList.get(position));
        //對(duì)條目設(shè)置監(jiān)聽
        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
    //獲取條目數(shù)量
    public int getItemCount() {
        return myList.size();
    }

    //定義視圖管理器
    class MyViewHolder extends RecyclerView.ViewHolder {

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
        }
    }

    //事件監(jiān)聽
    public interface MyClickListener {
        void setOnClickListener(int i);

        void setOnLongClickListener(int i);
    }
}

6.因?yàn)槔锩嬗斜O(jiān)聽,所以需要讓activity首先RvAdapter.MyClickListener接口,重寫方法

@Override
    public void setOnClickListener(int i) {
        Toast.makeText(this, "點(diǎn)擊" + i, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void setOnLongClickListener(int i) {
        Toast.makeText(this, "長按" + i, Toast.LENGTH_SHORT).show();
    }

最后記得不要忘記調(diào)用 接口的 set 方法,傳遞參數(shù)?。?!

//接口回調(diào)重要
        rvAdapter.setMyClickListener(this);

穿插一個(gè)簡單面試題,簡述接口回調(diào)的使用思路?

  1. 在要傳遞數(shù)據(jù)的類中 定義接口
//事件監(jiān)聽
    public interface MyClickListener {
        void setOnClickListener(int i);
        void setOnLongClickListener(int i);
    }
  1. 以該接口為數(shù)據(jù)類型 定義成員變量
private MyClickListener myClickListener;
  1. 給該變量 定義 set 方法
 public void setMyClickListener(MyClickListener myClickListener) {
        this.myClickListener=myClickListener;
    }
  1. 在要傳遞數(shù)據(jù)的監(jiān)聽中 使用接口對(duì)象調(diào)用接口方法
holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myClickListener.setOnClickListener(position);
            }
        });
  1. 在要使用數(shù)據(jù)的類中調(diào)用 接口的 set(參數(shù)) 方法(參數(shù)可以是 1 this 2匿名實(shí)現(xiàn)類對(duì)象 3定義一個(gè)類實(shí)現(xiàn)接口 使用該類對(duì)象)
 rvAdapter.setMyClickListener(this);

今天的文章就到這里了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容