1. 程式人生 > >[Android]Ultra-Pull-To-Refresh之listview下拉重新整理、上拉載入的用例-已更新

[Android]Ultra-Pull-To-Refresh之listview下拉重新整理、上拉載入的用例-已更新

前言

本次demo的編輯環境為android studio,java1.8

截圖

使用

1.本示例依賴jar如下:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'de.greenrobot:eventbus:2.4.0'
    compile('in.srain.cube:ultra-ptr:[email protected]') {
        exclude group: 'in.srain.cube', module: 'clog'
    }
    compile('in.srain.cube:cube-sdk:
[email protected]
') { exclude group: 'in.srain.cube', module: 'clog' } }
2.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="loadmore.example.jan.org.loadmoredemo.MainActivity">

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

        <in.srain.cube.views.loadmore.LoadMoreListViewContainer
            android:id="@+id/load_more_list_view_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/cube_mints_white">

            <ListView
                android:id="@+id/load_more_listview"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:divider="@null"
                android:fadingEdge="none"
                android:listSelector="@android:color/transparent"
                android:paddingLeft="12dp"
                android:paddingRight="12dp"
                android:scrollbarStyle="outsideOverlay" />
        </in.srain.cube.views.loadmore.LoadMoreListViewContainer>
    </in.srain.cube.views.ptr.PtrClassicFrameLayout>
</RelativeLayout>

PtrClassicFrameLayout 是一個可以起到下拉重新整理的實現的父類佈局,而LoadMoreListViewContainer則是載入更多的佈局控制元件。

3.MainActivity.java demo主要的程式碼實現,步驟和說明已註釋

/**
 * 利用android-Ultra-Pull-To-Refresh,上拉重新整理和上拉載入的簡單的dome
 */
public class MainActivity extends AppCompatActivity {
    private PtrFrameLayout mPtrFrameLayout;
    private LoadMoreListViewContainer mLoadMoreListViewContainer;
    private ListView mListView;

    private List<String> mockStrList = new ArrayList<>();
    private int start = 0;
    private int count = 15;
    private PagedListViewDataAdapter<String> mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1.find the listview
        mListView = (ListView) findViewById(R.id.load_more_listview);
        // 為listview的建立一個headerview,注意,如果不加會影響到載入的footview的顯示!
        View headerMarginView = new View(this);
        headerMarginView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, LocalDisplay.dp2px(20)));
        mListView.addHeaderView(headerMarginView);
        //2.繫結模擬的資料
        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mockStrList);
        mListView.setAdapter(adapter);
        //3.設定下拉重新整理元件和事件監聽
        mPtrFrameLayout = (PtrFrameLayout) findViewById(R.id.load_more_list_view_ptr_frame);
        mPtrFrameLayout.setLoadingMinTime(1000);
        mPtrFrameLayout.setPtrHandler(new PtrHandler() {
            @Override
            public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) {
                // here check list view, not content.
                return PtrDefaultHandler.checkContentCanBePulledDown(frame, mListView, header);
            }

            @Override
            public void onRefreshBegin(PtrFrameLayout frame) {
                //實現下拉重新整理的功能
                Log.i("test", "-----onRefreshBegin-----");
                mPtrFrameLayout.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mockStrList.clear();
                        start = 0;
                        mockStrList.addAll(getMockData(start, count));
                        mPtrFrameLayout.refreshComplete();
                        //第一個引數是:資料是否為空;第二個引數是:是否還有更多資料
                        mLoadMoreListViewContainer.loadMoreFinish(false, true);
                        adapter.notifyDataSetChanged();
                    }
                }, 500);
            }
        });
        //設定延時自動重新整理資料
        mPtrFrameLayout.postDelayed(new Runnable() {
            @Override
            public void run() {
                mPtrFrameLayout.autoRefresh(false);
            }
        }, 200);
        //4.載入更多的元件
        mLoadMoreListViewContainer = (LoadMoreListViewContainer) findViewById(R.id.load_more_list_view_container);
        mLoadMoreListViewContainer.setAutoLoadMore(true);//設定是否自動載入更多
        mLoadMoreListViewContainer.useDefaultHeader();
        //5.新增載入更多的事件監聽
        mLoadMoreListViewContainer.setLoadMoreHandler(new LoadMoreHandler() {
            @Override
            public void onLoadMore(LoadMoreContainer loadMoreContainer) {
                //模擬載入更多的業務處理
                mLoadMoreListViewContainer.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        start++;
                        mockStrList.addAll(getMockData(start * 10, count));
                        if (start * 10 > 30) {
//                          mLoadMoreListViewContainer.loadMoreFinish(true, false);
                            //以下是載入失敗的情節
                            int errorCode = 0;
                            String errorMessage = "載入失敗,點選載入更多";
                            mLoadMoreListViewContainer.loadMoreError(errorCode, errorMessage);
                        } else {
                            mLoadMoreListViewContainer.loadMoreFinish(false, true);
                        }
                        adapter.notifyDataSetChanged();
                    }
                }, 1000);
            }
        });
    }

    /**
     * 做一個簡單的內容資料
     * @param start 開始位置
     * @param count 每次拉取的數量
     * @return
     */
    private List<String> getMockData(int start, int count) {
        List<String> slist = new ArrayList<String>();
        for (int i = start; i < start + count; i++) {
            slist.add("內容編號:" + i);
        }
        return slist;
    }

}
-----------------------------更新時間:2016年2月24日 17:08:32---------------------------------------------------------

自定義底部載入內容

1.首先,確認載入狀態,實現LoadMoreUIHandler介面,程式碼如下:

public interface LoadMoreUIHandler {

    public void onLoading(LoadMoreContainer container);

    public void onLoadFinish(LoadMoreContainer container, boolean empty, boolean hasMore);

    public void onWaitToLoadMore(LoadMoreContainer container);

    public void onLoadError(LoadMoreContainer container, int errorCode, String errorMessage);
}

2.建立自己想要的載入佈局,同時要實現LoadMoreUIHandler介面
/**
 * Created by jan on 2016/2/24.
 */
public class ILoadMoreFooterView extends RelativeLayout implements LoadMoreUIHandler {
    private ImageView loadingImage;
    private TextView loadText;

    public ILoadMoreFooterView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public ILoadMoreFooterView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setupViews();
    }

    public ILoadMoreFooterView(Context context) {
        this(context, null);
    }

    private void setupViews() {
        LayoutInflater.from(getContext()).inflate(R.layout.custom_loadmore_footer, this);
        loadingImage = (ImageView) findViewById(R.id.loading_progress_icon);
        loadText = (TextView) findViewById(R.id.loading_text);
        setVisibility(GONE);
    }

    @Override
    public void onLoading(LoadMoreContainer container) {
        setVisibility(VISIBLE);
        loadingImage.setVisibility(VISIBLE);
        loadText.setText(R.string.loading_text);
        final RotateAnimation anim = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        anim.setInterpolator(new LinearInterpolator());
        anim.setRepeatCount(-1);
        anim.setDuration(1000);
        loadingImage.setImageResource(R.drawable.progress_loading2);
        loadingImage.startAnimation(anim);
    }

    @Override
    public void onLoadFinish(LoadMoreContainer container, boolean empty, boolean hasMore) {
        if (!hasMore) {
            setVisibility(VISIBLE);
            if (empty) {
                loadText.setText(R.string.loading_empty);
            } else {
                loadText.setText(R.string.loading_finish_empty);
            }
            loadingImage.setVisibility(INVISIBLE);
        } else {
            setVisibility(INVISIBLE);
        }
    }

    @Override
    public void onWaitToLoadMore(LoadMoreContainer container) {
        setVisibility(VISIBLE);
        loadText.setText(R.string.load_click_more);
        loadingImage.setVisibility(INVISIBLE);
    }

    @Override
    public void onLoadError(LoadMoreContainer container, int errorCode, String errorMessage) {
        loadingImage.clearAnimation();
        loadingImage.setImageResource(R.drawable.no_order_get);
        loadText.setText(R.string.loading_finish_error);
    }
}

3.最後的使用,在之前的程式碼中取消使用預設的“載入中”的footview,更換自己的view,程式碼如下
       ILoadMoreFooterView customMoreView = new ILoadMoreFooterView(this);
        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(-2, LocalDisplay.dp2px(80));
        customMoreView.setLayoutParams(lp);
        mLoadMoreListViewContainer.setLoadMoreView(customMoreView);
        mLoadMoreListViewContainer.setLoadMoreUIHandler(customMoreView);

//        mLoadMoreListViewContainer.useDefaultHeader();

效果圖


相關推薦

[Android]Ultra-Pull-To-Refreshlistview重新整理載入-更新

前言 本次demo的編輯環境為android studio,java1.8 截圖 使用 1.本示例依賴jar如下: dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) co

使用 android-Ultra-Pull-To-Refresh 實現 WebView 重新整理

Layout: <?xml version="1.0" encoding="utf-8"?> <in.srain.cube.views.ptr.PtrClassicFrameLayout xmlns:android="http://schemas.a

Android刷新控件android-Ultra-Pull-To-Refresh 使用

com 過程 kcon ava false design cube can out 一.gitHub地址及介紹 https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh android-Ultra-Pull-

重新整理載入框架:android-Ultra-Pull-To-Refresh

下拉重新整理上拉載入框架:PtrClassicFrameLayout 1、一個優雅的框架實現下拉重新整理上拉載入,學習來源:點選開啟連結 2、如何使用: 2.1、在專案中引入: compile 'com.shizhefei:MVCHelper-UltraRefresh:1

android-Ultra-Pull-To-Refresh-自定義顯示動畫1

android-Ultra-Pull-To-Refresh的下拉動畫很炫酷,特別是storehouse style型別的 貼一個自定義的動畫效果-audi車標的logo 效果 具體修改程式碼如下: <string-array name="stor

一個強大的重新整理框架android-Ultra-Pull-To-Refresh

最近在學習github上的一個開源專案:android-Ultra-Pull-To-Refresh(下面簡稱UltraPtr) 。這個專案主要用於Android APP中下拉重新整理的功能。 OK,之所以說UltraPtr非常強大,是因為它有以下兩個特點:  1. c

解決android-Ultra-Pull-To-Refresh 和ViewPager衝突的問題

由於PtrFrameLayout在dispatchOnTouchEvent中沒有判斷事件攔截的情況,導致PtrFrameLayout如果內部的content包含有ViewPager時會出現翻頁異常困難的情況,參考了網上的多的文章沒有解決,很多都是有bug的,今天在網上看到Sw

android-Ultra-Pull-To-Refresh重新整理框架與viewpager滑動衝突解決方案

文章概述: 問題描述: liaohuqiu 開源的 android-Ultra-Pull-To-Refresh 下拉重新整理框架,在使用時,會經常遇到巢狀banner的使用場景,即:子ViewGroup巢狀ViewPager使用,例如: <c

android-Ultra-Pull-To-Refresh/SwipeRefreshLayout巢狀ViewPager/ScrollView滑動衝突解決

前戲   每次必不可少的前戲又來了。發文時Android-PullToRefresh這個框架已經停止維護3年了,很多人在關心我們現在用什麼框架好,這裡給大家推薦兩個。一個是可愛可親起可恨的Google官方v4包自帶的SwipeRefreshLa

android-Ultra-Pull-To-Refresh 使用簡介

專案地址https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh 該專案只包含下拉重新整理,可以包裹任何控制元件,如果需要新增上拉載入,可以將包裹的view改為前篇文章的LoadMoreRecyclerView實現

Android仿QQ重新整理回彈

附上原始碼地址…… http://download.csdn.net/detail/qq_36255612/9717199 首先自定義一個Scrollview, 重寫computeScroll、on

Android 基於 MVP 框架的重新整理載入頁面,View和Presenter層基類封裝

前言 Android 專案開發中經常遇到列表式頁面,並且需要實現下拉重新整理,上拉到底後加載下一頁的功能,這裡結合我們專案正在使用的 MVP 框架,介紹一種基類封裝方案,實現 View、Adapter、資料處理Presenter層的基類封裝,後續繼承這幾個類,

Android RecyclerView重新整理載入更多到底自動載入更多

一、廢話 搞了這麼久的Android,可能是我渠道比較閉塞,一直沒找到比較好用的下拉重新整理,往上找的第三方比較知名的一些,都說有這樣那樣的瑕疵,一直用的SwipeRefreshLayout 做下拉載入,然後在RecycleView最後多加一個item,只要載入了這個ite

[log] vue使用Mint元件實現重新整理載入

https://mint-ui.github.io/docs/#/zh-cn2/loadmore 使用的vue <mt-loadmore :top-method="loadTop" :bottom

微信小程式重新整理載入

下拉重新整理: (1)直接呼叫onPullDownRefresh:function()事件,首先設定app.js以及有該需求的頁面json檔案中的 “enablePullDownRefresh”: true, //允許下拉重新整理 “backgroundTextStyle”: “dar

Apicloud——重新整理載入

2018-12-07  13:18:21 非Apicloud中的外掛 1 <!doctype html> 2 <html> 3 4 <head> 5 <meta charset="utf-8"> 6

vue better-scroll 使用 重新整理載入

我的目的是為了實現列表的下拉重新整理、上拉載入,所以選擇了better-scroll這個庫。 用好這個庫,需要理解下面說明 必須包含兩個大的div,外層和內層div 外層div設定可視的大小(寬或者高)-有限制寬或高 內層div,包裹整個可以滾動的部分 內層d

better-scroll實現重新整理載入更多(巨簡單...)

1、廢話少說,先看看移動端的列表頁面 (1)正常瀏覽 (2)下拉重新整理中 (3)下拉重新整理結束 (4) 上拉載入 (5)上拉 載入中 3、網上也有一些基本使用教程,這裡就不一一累贅,下

一個簡單好重新整理載入控制元件

*本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 有更新: 最新的庫版本為1.0.2(相容舊版本,舊版本是1.0.0),完整的庫地址: compile'com.zt.maven.widget:refreshview:1.0.2

詳解自主實現RecyclerView重新整理載入HeaderFooter以及swiperefreshlayout的部分講解

  年前年後的那段時間比較忙,忙的來忘了寫部落格。最近空閒了,有時間了,來看部落格發現有兩個來月沒有發文章了,對自己的沒有堅持先來幾個,部落格還是要寫的,以後會持續更新。   廢話少說,網上關於列表控