1. 程式人生 > >android RecyclerView簡單的使用

android RecyclerView簡單的使用

istview class inflater 開發 bin extends gradle onbind port

轉自:https://blog.csdn.net/lmj623565791/article/details/45059587

概述

RecyclerView出現已經有一段時間了,相信大家肯定不陌生了,大家可以通過導入support-v7對其進行使用。 據官方的介紹,該控件用於在有限的窗口中展示大量數據集,其實這樣功能的控件我們並不陌生,例如:ListView、GridView。

那麽有了ListView、GridView為什麽還需要RecyclerView這樣的控件呢?整體上看RecyclerView架構,提供了一種插拔式的體驗,高度的解耦,異常的靈活,通過設置它提供的不同LayoutManager,ItemDecoration , ItemAnimator實現令人瞠目的效果。

  1. 你想要控制其顯示的方式,請通過布局管理器LayoutManager
  2. 你想要控制Item間的間隔(可繪制),請通過ItemDecoration
  3. 你想要控制Item增刪的動畫,請通過ItemAnimator
  4. 你想要控制點擊、長按事件,請自己寫(擦,這點尼瑪。)

基本使用

鑒於我們對於ListView的使用特別的熟悉,對比下RecyclerView的使用代碼:

mRecyclerView = findView(R.id.id_recyclerview);
//設置布局管理器
mRecyclerView.setLayoutManager(layout);
//設置adapter
mRecyclerView.setAdapter(adapter)
//設置Item增加、移除動畫 mRecyclerView.setItemAnimator(new DefaultItemAnimator()); //添加分割線 mRecyclerView.addItemDecoration(new DividerItemDecoration( getActivity(), DividerItemDecoration.HORIZONTAL_LIST));

ok,相比較於ListView的代碼,ListView可能只需要去設置一個adapter就能正常使用了。而RecyclerView基本需要上面一系列的步驟,那麽為什麽會添加這麽多的步驟呢?

那麽就必須解釋下RecyclerView的這個名字了,從它類名上看,RecyclerView代表的意義是,我只管Recycler View,也就是說RecyclerView只管回收與復用View,其他的你可以自己去設置。可以看出其高度的解耦,給予你充分的定制自由(所以你才可以輕松的通過這個控件實現ListView,GirdView,瀑布流等效果)。

開發過程

1、首先要用這個控件,你需要在gradle文件中添加包的引用,編譯,下載相關依賴

implementation com.android.support:appcompat-v7:27.1.1
implementation com.android.support:recyclerview-v7:27.1.1

2.在activity_main.xml中寫布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

   <android.support.v7.widget.RecyclerView
       android:id="@+id/recycle"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       ></android.support.v7.widget.RecyclerView>

</LinearLayout>

3,在mainActivity中對recycleView進行初始化和使用

public class MainActivity extends AppCompatActivity {
    RecyclerView mRecycleView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化
        mRecycleView = findViewById(R.id.recycle);

        //設置布局:控制其顯示的方式,請通過布局管理器LayoutManager
        //mRecycleView.setLayoutManager(new LinearLayoutManager(this)); //設置線性布局
        mRecycleView.setLayoutManager(new GridLayoutManager(this,2));  //設置網格布局,一行2個數據
        //mRecycleView.setLayoutManager(new StaggeredGridLayoutManager(4,4)); //設置

        //Adapter適配器,將數據轉換成activity能夠理解的數據
        mRecycleView.setAdapter(new HomeAdapter(this));
    }

}

4.適配器Adapter的創建

RecyclerViewAdapter.class :繼承RecyclerView.Adapter後,會重寫三個方法:

onCreateViewHolder()方法,創建ViewHolder:負責承載每個子項的布局。它有兩個參數,其中一個是 int viewType;
onBindViewHolder()方法,綁定數據;負責將每個子項holder綁定數據。倆參數分別是RecyclerView.ViewHolder holder, int position;

public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> {

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }

具體代碼:

public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> {
    private Context mContext; //上下文
    private  LayoutInflater mLayoutInflater; //布局壓力泵
    private String[] mTitles;  //數據
    public HomeAdapter(Context context){
        mContext = context;
        mLayoutInflater = LayoutInflater.from(mContext);
        mTitles = context.getResources().getStringArray(R.array.titles); //res文件下資源文件value文件夾下array.xml文件,item name="titles"
    }
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        //初始化ViewHolder,將壓力泵存入初始化ViewHolder的構造函數
        MyViewHolder holder =new MyViewHolder(mLayoutInflater.inflate(R.layout.item_home, parent,
                false));
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    //對tv設置值 holder.tv.setText(mTitles[position]);//mTitles是數組取值方式是mTitles[position],如果是對象是mTitles.getPosition() } @Override
public int getItemCount() { return mTitles==null?0:mTitles.length; } public class MyViewHolder extends RecyclerView.ViewHolder {
     //初始化tv TextView tv;
public MyViewHolder(View itemView) { super(itemView); tv = itemView.findViewById(R.id.id_num); } } }

item_home的布局,通過對item_home布局的復用

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="50dp">
    <TextView
        android:id="@+id/id_num"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:text="1"
        android:background="#eee"
        android:layout_margin="5dp"
        />
</FrameLayout>

LinearLayoutManage的展示效果

技術分享圖片

GridLayoutManage的展示效果

技術分享圖片

android RecyclerView簡單的使用