1. 程式人生 > >Android滾動元件RecyclerView 的用法

Android滾動元件RecyclerView 的用法

RecyclerView屬於新增控制元件,為了讓RecyclerView在所有Android版本都能使用,所以Android團隊將RecyclerView定義在了support庫中,因此,想要使用RecyclerView控制元件,需要在build.gradle中新增相應的依賴庫

implementation 'com.android.support:recyclerview-v7:26.1.0'

或者也可以直接引入support:design這個依賴,這個包括Recycler

implementation 'com.android.support:design:26.1.0'

——————————————————————————

   dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.android.support:appcompat-v7:26.1.0'
        implementation 'com.android.support.constraint:constraint-layout:1.1.3'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    //    implementation 'com.android.support:recyclerview-v7:26.1.0'
        implementation 'com.android.support:design:26.1.0'
    }

在佈局中通過這個加入RecyclerView控制元件

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


</android.support.v7.widget.RecyclerView>

RecyclerView需要一些常用的方法,具體方法如下:

◆ setLayoutManager:設定列表項的佈局管理器,

LinearLayoutManager為線性佈局管理器、GridLayoutManager為網格佈局管理器、StaggeredGridLayoutManager為瀑布流網格佈局管理器。

◆ setItemAnimator:設定列表項增加或者是刪除時的動畫,可以使用關鍵字new建立 DefaultItemAnimator()物件實現系統預設的動畫效果。

◆ addItemDecoration:新增列表項分割線。

◆ addOnItemTouchListener:新增列表項的觸控監聽器。

◆ removeOnItemTouchListener:移除列表項的觸控監聽器。

◆ setAdapter:設定列表項的介面卡,使用RecyclerView.Adapter。

RecyclerView.Adapter是為RecyclerView所單獨設計的介面卡類,RecyclerView.Adapter的相關方法如下:

◆ getItemCount:獲取列表項的數目。

◆ onBindViewHolder:繫結列表項中所顯示的資料。

◆ onCreateViewHolder:在該方法中可以載入列表item(子項)中的佈局檔案。

在onCreate方法中設定佈局管理器

 private RecyclerView recyclerView;

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

    );
        recyclerView = findViewById(R.id.act_recyclerView);
        //設定為線性佈局管理器
//      上面的LinearLayoutManager有三個引數:
//     (1) Context   (2)方向,下面是垂直方向,還可以選擇水平方向LinearLayoutManager.HORIZONTAL
//     (3)是否顛倒循序,這個是針對資料來源的,就是把你傳進去的資料進行倒著顯示,
//      比如你傳進去的集合是{1,2,3,4},那麼這個引數為false的時候,顯示的是1,2,3,4,
//      但是如果你選擇的是true,顯示的是4,3,2,1。
//      效果跟listView差不多
        recyclerView.setLayoutManager(new LinearLayoutManager(RecyclerActivity.this
                , LinearLayoutManager.VERTICAL, false));

//        網格佈局管理器(GridLayoutManager),這個佈局管理器有兩個引數:
//        (1)Context  (2)顯示多少列
//        這種是比較常見和常用的佈局管理器,把資料整整齊齊的想網格一樣的把資料顯示出來。
//        recyclerView.setLayoutManager(new GridLayoutManager(this, 3));


//        瀑布流佈局管理器(StaggeredLayouManager):
//        有兩個引數:
//        (1)Context  (2)顯示列數
//        這個一般是用來顯示那些item高度不一的佈局的
//        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, 
//        StaggeredGridLayoutManager.VERTICAL));

    }

新建一個Student類,其中屬性有id和name,新增建構函式和Getter and Setter

這裡就不放Student 的程式碼了

建立一個item所需的佈局layout_student_item.xml,這裡就簡單寫了兩個TextView

    <TextView
    android:id="@+id/item_student_id_tv"
    android:layout_width="0dp"
    android:layout_height="wrap_content" 
    android:layout_weight="1"
    android:gravity="center"
    android:text="id"
    />

下一步,新建一個介面卡,並繼承 android.support.v7.widget.RecyclerView.Adapter,

並自動實現其中的三個方法

在這裡插入圖片描述

StduentAdapter中的程式碼如下:

public class LinearAdapter extends RecyclerView.Adapter<LinearAdapter.LinearViewHolder> {
private Context mContext;
private List mList;

public LinearAdapter(Context mContext, List mList) {
    this.mContext = mContext;
    this.mList = mList;
}

//建立
@Override
public LinearViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //在這裡設定佈局管理器
    return new LinearViewHolder(LayoutInflater.from(mContext)
    .inflate(R.layout.layout_student_item,parent,false));
}

@Override
public void onBindViewHolder(LinearViewHolder holder, int position) {
    //將條目資訊設定上
    Student stu = (Student) mList.get(position);
    holder.idTv.setText(""+stu.getId());
    holder.nameTv.setText(stu.getName());

}

@Override
public int getItemCount() {
    //設定條目的長度
    return mList.size();
}

//建立一個LinearViewHolder類,
// 然後在RecyclerView.Adapter中新增泛型LinearAdapter.LinearViewHolder
class LinearViewHolder extends RecyclerView.ViewHolder {


    private final TextView idTv;
    private final TextView nameTv;

    public LinearViewHolder(View itemView) {
        super(itemView);
        //宣告佈局裡的控制元件
        idTv = itemView.findViewById(R.id.item_student_id_tv);
        nameTv = itemView.findViewById(R.id.item_student_name_tv);
    }
}

}

最後在RecyclerActivity中新增如下程式碼

    //建立一個集合用於儲存物件
    List ls = new ArrayList();
    //這裡測試,先迴圈插入一些資料
    for (int i = 1; i <= 10000; i++) {
        ls.add(new Student(i, "student"));
    }
    recyclerView.setAdapter(new LinearAdapter(this,ls));

這樣列表基本功能就完成了,可是和ListView相比,少了條目分割線

RecyclerView可以自定義分割線,可以參照我的另一篇部落格

RecyclerView列表呼叫addItemDecoration實現新增自定義分割線