Sử dụng SwipeRefreshLayout trong ứng dụng Android

Ví dụ này mình sẽ hướng dẫn các bạn sử dụng SwipeRefreshLayout với RecyclerView trong ứng dụng Android.

Để có thể luôn hiển thị những dữ liệu mới nhất, chúng ta thường thực hiện cập nhật dữ liệu một cách tự động trong 1 thời gian ngắn hoặc 1 thời gia khá dài, trong nhiều trường hợp đó không phải hoàn toàn là một cách hay từ phía user, nó có thể gây tiêu tốn lưu lượng mà khiến user thấy đó là không cần thiết hoặc cũng có thể khiến user thấy lâu có hàng mới thế. Vì vậy sao ta ko để user có thể tự mình cập nhật dữ liệu mới khi thấy cần thiết. Và thật hay ho là nền tảng Android cung cấp cho chúng ta một design pattern swipe-to-refresh để thực hiện việc đó.

Chú ý: Lớp này yêu cần phiên bản mới nhất của Android v4 Support Library APIs.

Ví dụ đối với các ứng dụng thời tiết, khi user muốn biết bây giờ lạnh bao nhiêu độ thì chỉ đơn giản là kéo ngón tay từ top màn hình xuống để refresh data, thật tiện lợi phải không.

Sử dụng SwipeRefreshLayout trong ứng dụng Android
Sử dụng SwipeRefreshLayout trong ứng dụng Android

Add the SwipeRefreshLayout Widget

Add SwipeRefreshLayout như là cha của một ListView, RecyclerView hoặc GridView. Chú ý là SwipeRefreshLayout chỉ hỗ trợ cho một View đơn, SwipeRefreshLayout  không thể chứa vừa RecyclerView vừa GridView được .

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/srlLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

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

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

    </android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>

Tạo thêm custom item cho RecyclerView

cat_name_item.xml

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

    <TextView
        android:id="@+id/tvCatName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textSize="20sp" />

    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="@android:color/darker_gray" />

</LinearLayout>

Tạo String Array cat names, array này dùng làm dữ liệu để hiển thị lên RecyclerView

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="cat_names">
        <item>George</item>
        <item>Zubin</item>
        <item>Carlos</item>
        <item>Frank</item>
        <item>Charles</item>
        <item>Simon</item>
        <item>Fezra</item>
        <item>Henry</item>
        <item>Schuster</item>
        <item>Abe</item>
        <item>Sally</item>
        <item>Geordie</item>
        <item>Alex</item>
        <item>Ebenezer</item>
        <item>Ulric</item>
        <item>Donovan</item>
    </string-array>
</resources>

Tạo Custom RecyclerView extends RecyclerView.Adapter

RecyclerViewAdapter.java

package ntc.dev4u.com.swiperefreshlayoutexample;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * IDE: Android Studio
 * Created by Nguyen Trong Cong  - NTCDE.COM
 * Name packge: ntc.dev4u.com.swiperefreshlayoutexample
 * Name project: SwipeRefreshLayoutExample
 * Date: 4/13/2017
 * Time: 20:43
 */

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
    List<String> mCatNames;
    private Context mContext;

    public RecyclerViewAdapter(Context context) {
        mContext = context;
        randomizeCatNames();
    }

    public void randomizeCatNames() {
        mCatNames = Arrays.asList(getCatNamesResource());
        Collections.shuffle(mCatNames);
    }

    private String[] getCatNamesResource() {
        return mContext.getResources().getStringArray(R.array.cat_names);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View inflatedView = LayoutInflater.from(mContext).inflate(R.layout.cat_name_item, viewGroup, false);
        return new ViewHolder(inflatedView);
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int i) {
        String catName = getItem(i);
        viewHolder.mCatNameTextView.setText(catName);
    }

    public String getItem(int position) {
        return mCatNames.get(position);
    }

    @Override
    public int getItemCount() {
        return mCatNames.size();
    }


    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView mCatNameTextView;

        public ViewHolder(View itemView) {
            super(itemView);
            mCatNameTextView = (TextView) itemView.findViewById(R.id.tvCatName);
        }
    }
}

Cuối cùng là MainActivity

MainActivity.java

package ntc.dev4u.com.swiperefreshlayoutexample;

import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener {

    private RecyclerView mRecyclerView;
    private SwipeRefreshLayout mSrlLayout;
    private RecyclerViewAdapter mRecyclerViewAdapter;

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

    private void initView() {
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        mSrlLayout = (SwipeRefreshLayout) findViewById(R.id.srlLayout);
        final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);
        setupAdapter();

        mSrlLayout.setColorSchemeResources(R.color.orange, R.color.green, R.color.blue);
        mSrlLayout.setOnRefreshListener(this);
    }

    @Override
    public void onRefresh() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                setupAdapter();
                mSrlLayout.setRefreshing(false);
            }
        }, 2500);
    }

    private void setupAdapter() {
        mRecyclerViewAdapter = new RecyclerViewAdapter(this);
        mRecyclerView.setAdapter(mRecyclerViewAdapter);
    }
}

Trong MainActivity bạn thấy method setColorSchemeResources

mSrlLayout.setColorSchemeResources(R.color.orange, R.color.green, R.color.blue);

Phương thức setColorSchemeResources dùng để set màu cho swipe bar, hiển thị khi người dùng vuốt từ trên xuống trong SwipeRefreshLayout.

Sử dụng SwipeRefreshLayout trong ứng dụng Android
Sử dụng SwipeRefreshLayout trong ứng dụng Android

Sự kiện onRefresh()

    @Override
    public void onRefresh() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                setupAdapter();
                mSrlLayout.setRefreshing(false);
            }
        }, 2500);
    }

Method này sẽ thực hiện hành động khi Refresh Layout, trong hàm trên nó sẽ khởi tạo lại RecyclerViewAdapter  ẩn swipe bar sau 2500Millis(2.5s), thường thì phương thức setRefreshing(false) được gọi sau khi đã load xong dữ liệu hoặc load dữ liệu bị lỗi.

Project on Github: https://github.com/trongcong/SwipeRefreshLayoutExample

Gom Marker trong Android với Google Maps Android API – Google Maps Android Marker Clustering Utility Hướng dẫn tạo Material Dialog Bottom Sheet Android Tạo context menu trong Android – ActionBar ActionMode.CallBack Example Retrofit và Volley thư viện nào tốt hơn Hướng dẫn sử dụng thư viện Volley trong Android Tạo Web Service bằng PHP và MYSQL cho ứng dụng di động – Part 2 Tạo Web Service bằng PHP và MYSQL cho ứng dụng di động – Part 1 Hàm chuyển đổi Timestamp thành Datetime trong Android và JavaScript Design Patterns là gì? Tạo Project Android theo mẫu Design Patterns(Part 2) Design Patterns là gì? Tạo Project Android theo mẫu Design Patterns(Part 1)

2 thoughts on “Sử dụng SwipeRefreshLayout trong ứng dụng Android

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.