[Android Cơ Bản] RecyclerView trong Android

Trước khi xem bài này các em nên xem bài ListView lần trước nhé 🙂

RecyclerView là gì ?

RecyclerView là 1 widget trong lập trình Android dùng để hiển thị danh sách dữ liệu theo nhiều dạng như list(danh sách ), grid (lưới) theo chiều ngang hoặc dọc màn hình. Nó được coi như bản nâng cấp của ListView với nhiều tính năng hơn, tối ưu và linh hoạt trong việc tùy biến theo nhu cầu của lập trình viên

Thường đi kèm với RecyclerView là layout CardView – Thầy sẽ đề cập trong 1 bài khác nhé

Ưu điểm của RecyclerView ( Đi phỏng vấn dễ bị hỏi câu này 😀 )

  1. Khởi tạo sẵn các item chưa được hiển thị. Ví dụ : Trên màn hình danh sách hiển thị các item từ 0 – 9, thì RecyclerView (T viết tắt) đã khởi tạo item thứ 10 sẵn. Bằng cách này khi người dùng cuộn thì item đã sẵn sàng để hiển thị.
  2. ViewHolder : RecyclerView tích hợp sẵn sử dụng ViewHolder để tái sử dụng các đối tượng trên các hàng như thành phần giao diện, các câu lệnh khởi tạo …
  3. notifyItemChanged : phương thức cập nhật thay đổi cho item được chỉ định thay vì như Adapter của Listview notifyDataSetChanged


Để bắt đầu với RecyclerView chúng ta tiến hành các bước sau :

Thêm thư viện

Truy cập file build.gradle thêm dòng import thư viện vào thẻ dependencies. Lưu ý : cần có mạng internet để chương trình đồng bộ thư viện

dependencies {
    implementation 'com.android.support:recyclerview-v7:28.0.0'
}

Thêm RecyclerView vào layout

<?xml version="1.0" encoding="utf-8"?>
<!-- A RecyclerView with some commonly used attributes -->
<android.support.v7.widget.RecyclerView
    android:id="@+id/rvList"
    android:scrollbars="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

Khai báo RecyclerView trong Activity

public class MyActivity extends Activity {
    private RecyclerView rvList;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager layoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);
        recyclerView =  findViewById(R.id.rvList);

        // sử dụng câu lệnh này nếu kích thước các hàng luôn
 // bằng nhau. việc này giúp list mượt hơn
        recyclerView.setHasFixedSize(true);

        // sử dụng LayoutManager để quy định kiểu hiển thị cho list là hàng dọc 
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

        // Khai báo Adapter (mn xem tiếp ví dụ dưới nhé)
        mAdapter = new MyAdapter(myDataset);
        recyclerView.setAdapter(mAdapter);
    }
    // ...
}

Tạo Adapter

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    private String[] mDataset;

    // khởi tạo ViewHolder để khai báo các thành phần giao diện //trên hàng 
    public static class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView textView;
        public MyViewHolder(TextView v) {
            super(v);
            textView = v;
        }
    }

    private List<Student> studentList
    // Hàm khởi tạo với danh sách dữ liệu là Student
    public MyAdapter(List<Student> studentList) {
        this.studentList = studentList;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent,  int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.row, parent, false);
     
        MyViewHolder vh = new MyViewHolder(v);
        return vh;
    }
    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        holder.textView.setText(mDataset[position]);
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return mDataset.length;
    }
}

Tùy chọn kiểu hiển thị

RecyclerView sử dụng LayoutManager để chỉ định cách mà nó hiển thị danh sách các dữ liệu

LinearLayoutManager : dùng để hiển thị danh sách theo chiều dọc – tương đồng như ListView

GridLayoutManager : dùng để hiển thị danh sách theo dạng dưới – tương đồng như GridView

StaggeredGridLayoutManager : dùng để hiển thị danh sách theo dạng lưới các Item trong list được xếp lệch, so le nhau, các em xem ảnh ví dụ phía dưới

StaggeredGridLayoutManager 

Chi tiết ví dụ mn xem thêm tại link : https://github.com/huuhuybn/RecycleView

Thắc mắc, hỗ trợ giải đáp tại nhóm học tập : https://www.facebook.com/groups/413212646182883/

Bài hướng dẫn được phát lúc 21h ngày 04/06/2019 tại page https://www.facebook.com/HuyNguyenAndroid/

Video 2k xem lại tại kênh : https://www.youtube.com/channel/UCrX5WbVYOs2IheACdjRsxpA

Link video bài hướng dẫn : https://www.youtube.com/watch?v=jrpibq_wydk