Androidドロップダウンリフレッシュまとめ


Androidドロップダウンのリフレッシュはiosシステムの体験から始まり、その後、海外のjohannilssonが最初のオープンソースコントロールを書いた(https://github.com/johannilsson/android-pulltorefresh)、その後多くの国内の私たちはこの基礎の上で多くの修正をしましたが、体験が完璧ではなく、最終的にchrisbanes(https://github.com/chrisbanes/Android-PullToRefresh)に書かれたバージョンは、今ではたくさん更新されているのではないでしょうか.著者もjohannilssonをベースに修正し、expandlistview、gridview、webview、scrollview、view pager、listfragmentなどのサポートを加えた.ところで、コントロールの原理は難しくありませんが、書くときは細部ばかりで、こんなに規範的に書くことができて、功力も普通ではありません.
以下から抜粋:http://blog.csdn.net/fei5050/article/details/8442566
最近androidドロップダウンリフレッシュの機能を学び、簡単な使い方ができましたので、ここでまとめてみます.私は全部で3つの関連するdemoを見つけて、その中の前の2つはどこで見つけたのか覚えていません.まずここで黙って大神に感謝します.
最初のdemo(NLPullRefreshViewDemo):
1.レイアウト:自分で1つのコンポーネントの名前を書いて、NLPullRefreshViewはLinearLayoutから継承して、NLPullRefreshViewの中で1つのListViewがNLPullRefreshViewをいっぱい占めて、更に1つのViewをinflateして、このViewの幅をNLPullRefreshViewと同じ幅に設定して、高さwrap_contentは、上から高さの反対数に設定し、ListViewの上、つまり画面の上に隠します.2.イベント応答:外はNLPullRefreshViewで、中にはListViewがあります.touchイベントはいったい誰が応答しますか.私の理解は、ViewGroupのコールバック関数onInterceptTouchEventを使用して、誰がTouchイベントに応答しているのかを区別することです.onInterceptTouchEventがfalseを返すと、touchイベントはListViewに転送されます.onInterceptTouchEventがtrueを返すと、イベントはListViewに渡されません.これにより、TouchイベントはNLPullRefreshViewのonTouchEventメソッドで処理できます.ViewGroupのonInterceptTouchEventについて次のブログでまとめます.
2番目のdemo(TestPullAndRefresh):
1.レイアウト:1つのコンポーネントがMyListViewから継承することを書いて、更に1つのViewをinflateして、ListViewの上に追加して、void androidを使います.widget.ListView.addHeaderView(Viewv,Object data,boolean isSelectable)というメソッドが追加されました.その中で追加する過程でMeasureという方法を使ったことがありますが、androidのインタフェースの描画については、Measure->layout->draw、ずっと雲の中の霧の中で、あの大神はこの方面の資料を共有してくれて、先に感謝しました.2.イベント応答:ここではイベント応答が簡単で、ListViewは1つしかありません.onScrollメソッドでは、ListViewの最初のリスト項目が一番上にあるかどうかを判断して、ドロップダウンしてHeaderを表示するかどうかを区別します.イベント応答が上のdemoと異なるため、ここの違いを表す現象があり、ListViewを押して少し上にスライドし、さらに下にスライドし、最初のdemoにはHeaderは表示されず、2番目のdemoにはHeaderが表示されます.3.ステータス:このdemoには5つのステータスが定義されており、このdemoではonTouchEventで1つのステータスを変更し、次にステータスによってレイアウトを調整する方法を呼び出し、このメソッドでアニメーションを行い、5つのステータスはtouchUpの後のステータスを表すのに十分である.
この2つのdemoをまとめます.
1.レイアウトから言えば、LinearLayoutを継承してもListViewを継承しても、View Groupであり、View Groupの2つのViewである.2.いずれもステータスを使用しているが、明らかにドロップダウンの程度によってヘッドのステータスが異なる.3.イベント応答としてはonTouchEventの処理方法であり、処理の前にHeaderのプルダウンを開始するか否かを判断し、プルダウンであればTouchイベントy座標の変化によりHeaderの位置を設定し、前のdemo設定ではHeaderの上外マージン(LayoutParams.topMargin)を用い、次のdemoは、内側マージン(headerView.setPadding(0,-1*headerContentHeight,0,0))を使用します.ここには一般的にインタフェースがありますが、インタフェースの中の方法を調整して、外でそのインタフェースを実現するクラスに具体的なリフレッシュをさせます.4.机能は比较的に単一で、例えば私は上でリフレッシュしたいと思って、多くのコードをコードしなければなりません.
3番目のdemo(PullToRefresh):
前の仁兄が言ったように、この大神が考えているように規範的ではありません.勉強しました.ライブラリ項目に4600行のコードがあることをざっと数えてみましたが、コード量的には特に多くはありませんが、ほとんど注釈がなく、変数が多く、変数の英語の名前だけでは何のために使われているのか推測しにくく、呼び出しが複雑で、見たことのないクラスが現れることもあります.もっと重要なのは、私がこんなに複雑なプロジェクトを見たのは初めてで、しばらく理解していなかったので、次の目標はこの大神の考えを深く理解することです.このdemoに対する私の理解を簡単にまとめます.
1.最も重要なクラスは
public abstract class PullToRefreshBase<T extends View> extends LinearLayout implements IPullToRefresh<T> 

それは、前の2つのdemoと似ていて、実はすべてView Groupから継承されています.ListViewだけでなく、より多くのコンポーネントにドロップダウン・リフレッシュを実現させるために、このクラスは汎用的でを使用しています.これは、Viewでもいいという意味です.彼がくれたdemoにはwebview、Viewpagerなどがあります.2.PullToRefreshBaseの中のいくつかの重要なView、T mRefreshableView;これはスライドできるビュー、そして
private LoadingLayout mHeaderLayout;
private LoadingLayout mFooterLayout;

LoadingLayoutはFrameLayoutから継承され、リフレッシュの先頭と末尾です.ここではドロップダウン・リフレッシュとアップ・リフレッシュをサポートします.これはそれぞれ彼らのViewで、現在のモードを識別する列挙変数があり、現在の状態を示す列挙変数があります.3.このライブラリイベント処理もonInterceptTouchEventとonTouchEventであり、onInterceptTouchEventにはスライド方向の判断があり、左引きと右引きのリフレッシュがサポートされているためである.4.ライブラリは分かりにくいように見えますが、どちらのクラスを使うか、レイアウトをして、最後にコールバックインタフェースを実現すれば終わりです.ViewPagerのListViewのドロップダウンでリフレッシュする場合と小さな問題ですが、実はViewPagerの中のItemはPullToRefreshListView(このクラスはPullToRefreshBaseから継承されています)で、demoの中のイベント応答ではViewPagerのどのItemがリフレッシュしたのかは区別されません.リフレッシュコールバック関数を設定します.この関数のパラメータは
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
new GetDataTask(refreshView).execute();
}

このオブジェクトの中から彼がViewPagerの何番目かのItemであることを確定することができなくて、私はPullToRefreshBaseクラスの中で属性を追加して、それを使ってPullToRefreshBaseの身分を表示して、PullToRefreshBaseの中で身分を表示する属性があるかもしれませんが、私は見つけていません.PullToRefreshBaseでは、そのオブジェクトは中のListViewを得ることができ、このListViewオブジェクトでAdapterオブジェクトを得ることができ、リストのデータをリフレッシュするにはAdapterを用いる.notifyDataSetChanged()メソッドであるが、先に得るListViewで得られたAdapterオブジェクトはListAdapterタイプであり、継承関係からはない.notifyDataSetChanged()メソッドでは、Adapterオブジェクトは自分でメンテナンスしなければならないので、ViewPagerのListViewのリフレッシュコールバック関数が実行されるときは、そのアイデンティティを知らなければ、対応するAdapterを見つけてリフレッシュできません.
ソースのダウンロード:
最初の2つのdemoのダウンロードアドレス:https://github.com/bingoSpunky/pulltorefreshdemo大神のdemoのダウンロードアドレス:https://github.com/chrisbanes/Android-PullToRefresh