1. 程式人生 > >關於RecyclerView的下拉重新整理,自定義幀動畫,第三方框架PtrFrameLayout使用手冊

關於RecyclerView的下拉重新整理,自定義幀動畫,第三方框架PtrFrameLayout使用手冊

首先放上一張gif圖片

首先是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"
    android:orientation="vertical"
    tools:context="yianke.example_06.MainActivity">


    <in.srain.cube.views.ptr.PtrFrameLayout
        android:id="@+id/main_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!--頭部重新整理-->
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/main_top_animation"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:layout_gravity="center"/>
        </FrameLayout>

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


    </in.srain.cube.views.ptr.PtrFrameLayout>


</LinearLayout>

其次是java程式碼:

import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;

import com.github.library.BaseRecyclerAdapter;
import com.github.library.BaseViewHolder;

import java.util.ArrayList;
import java.util.List;

import butterknife.Bind;
import butterknife.ButterKnife;
import in.srain.cube.views.ptr.PtrDefaultHandler;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrHandler;

public class MainActivity extends AppCompatActivity
{

    @Bind(R.id.main_top_animation)
    ImageView mMainTopAnimation;
    @Bind(R.id.main_recycler)
    RecyclerView mMainRecycler;
    @Bind(R.id.main_frame)
    PtrFrameLayout mMainFrame;

    private LinearLayoutManager mManager;
    private AnimationDrawable mAnimation;

    private List<String> mList;
    private BaseRecyclerAdapter<String> mAdapter;



    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        initViews();
    }

    private void initViews()
    {
        initDatas();
        mMainRecycler.setLayoutManager(mManager);
        mMainRecycler.setAdapter(mAdapter = new BaseRecyclerAdapter<String>(this, mList, R.layout.main_item)
        {
            @Override
            protected void convert(BaseViewHolder helper, String item)
            {
                helper.setImageResource(R.id.item_img, R.mipmap.ic_launcher);
                helper.setText(R.id.item_titles, item);
            }
        });

        //下拉重新整理
        mMainFrame.setPtrHandler(new PtrHandler()
        {
            @Override
            public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header)
            {
                return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);
            }

            @Override
            public void onRefreshBegin(PtrFrameLayout frame)
            {
                mMainFrame.postDelayed(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        mMainFrame.refreshComplete();//重新整理完畢
                        refreshDatas();
                    }
                }, 2000);
            }
        });
    }

    /**
     * 初始化資料
     */
    private void initDatas()
    {
        mList = new ArrayList<>();
        setDatas();
        mManager = new LinearLayoutManager(this);
        mMainTopAnimation.setImageResource(R.drawable.main_top_animation);
        mAnimation = (AnimationDrawable) mMainTopAnimation.getDrawable();
    }

    /**
     * 設定資料
     */
    private void setDatas()
    {
        if (mList.size() == 0)
        {
            for (int i = 1; i < 3; i++)
            {
                mList.add("...豌豆..." + i);
            }
        }
    }

    /**
     * 重新整理資料
     */
    private void refreshDatas()
    {
        int itemCount = mManager.getItemCount();
        mList.clear();
        if (mList.size() == 0)
        {
            for (int i = 0; i < itemCount; i++)
            {
                mList.add("我是重新整理後的資料...");
            }
            mAdapter.notifyDataSetChanged();
        }
    }
}
這些都相當的基礎和簡單,其中需要說明的是:BaseRecyclerAdapter這個類,其實就是網上的開源庫,適配adapter的使用,沒什麼難度。然後就是動畫的製作了,不明白幀動畫的實現的,可以去網上搜索一下,理解一下。我這裡就不bb了。。。

直接上程式碼

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/tgp_lol_refreshing_0" android:duration="100"/>
    <item android:drawable="@drawable/tgp_lol_refreshing_1" android:duration="100"/>
    <item android:drawable="@drawable/tgp_lol_refreshing_2" android:duration="100"/>
    <item android:drawable="@drawable/tgp_lol_refreshing_3" android:duration="100"/>
    <item android:drawable="@drawable/tgp_lol_refreshing_4" android:duration="100"/>
    <item android:drawable="@drawable/tgp_lol_refreshing_5" android:duration="100"/>
    <item android:drawable="@drawable/tgp_lol_refreshing_6" android:duration="100"/>
    <item android:drawable="@drawable/tgp_lol_refreshing_7" android:duration="100"/>
    <item android:drawable="@drawable/tgp_lol_refreshing_8" android:duration="100"/>
    <item android:drawable="@drawable/tgp_lol_refreshing_9" android:duration="100"/>
    <item android:drawable="@drawable/tgp_lol_refreshing_10" android:duration="100"/>
    <item android:drawable="@drawable/tgp_lol_refreshing_11" android:duration="100"/>
    <item android:drawable="@drawable/tgp_lol_refreshing_12" android:duration="100"/>
    <item android:drawable="@drawable/tgp_lol_refreshing_13" android:duration="100"/>
    <item android:drawable="@drawable/tgp_lol_refreshing_14" android:duration="100"/>



</animation-list>

其中需要說明的是:
android:oneshot="false"
設定為false:代表動畫執行完一次了,迴圈執行播放,設定為true,就只執行一次。

需要說明的是下拉重新整理的開源庫中的一個介面:

//下拉重新整理
        mMainFrame.setPtrHandler(new PtrHandler()
        {
            @Override
            public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header)
            {
                return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header);
            }

            @Override
            public void onRefreshBegin(PtrFrameLayout frame)
            {
                mMainFrame.postDelayed(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        mMainFrame.refreshComplete();//重新整理完畢
                        refreshDatas();
                    }
                }, 2000);
            }
        });

複寫的第一個方法,是判斷是否可以執行下拉重新整理,第二個方法:可以再這個方法中執行重新整理操作;大概就這麼多。