リフレッシュする作業プル

これは、Pullの実際の実装がAndroid向けにどのように更新されたかについてのストーリーです。 コード例はまったくありません。 いくつかの写真と、記事の最後にプロジェクトアーカイブへのリンクがあります。



最近、現在のアプリケーションで更新するためにPullを埋め込む必要がありました。 これは今ではファッショナブルであり、ユーザーはそれに慣れており、Twitterクライアントの標準になっています。 ネットワーク上で既製のソリューションを検索した結果、唯一の選択肢が得られました-GithubのオープンソースプロジェクトJohan Nilsson android-pulltorefresh











ヘッダーがListViewに挿入され、必要に応じて非表示になります。 ソリューションは機能していますが、非常に曲がっています。 多くの場合、ある状態でフリーズします。 リストに要素がほとんどなく、ListViewに割り当てられたすべてのスペースを占有していない場合、ヘッダーは非表示にならず、碑文はタップして更新されます。 この実装の論理的な制限。 このプロジェクトを動作中のアプリケーションに追加すると、別の機能が発見されました。 Pull to refreshはヘッダーであるため、多くの場合、setSelection(1)メソッドを実行してヘッダーを非表示にします。 そして、位置の保存と復元を使用しているため、もちろんsetSelectionの定数呼び出しはすべてを台無しにします。



最初に、彼らはこの実装を最終決定して、最も不快な瞬間を修正することに決めました。 1つのプロジェクトに組み込まれています。 しかし、私は望んでいたようにはできませんでした。ヘッダーの使用に関する制限が影響しました。



どうやって違うやり方をするかというアイデアがあり、自由時間が現れました。 問題はヘッダーにあるため、1つのLinearLayoutでビューとリストビュー自体を更新して移動するには、それを削除してプルする必要があります。 理想的には、公式のTwitterクライアントと同じプルを取得して更新したかったのです。 しかし、別の束がそこで使用されます。 プルツーリフレッシュはスムーズで、どこでもうまく機能します。 一般的に、私たちは公式のTwitterクライアントの仕事を見るのに多くの時間を費やしました。



何をどのように移動するかについては、多くのオプションがあります。 プルを移動して、View、ListView、およびLinearLayoutを更新できます。 Padding、Margin、またはScrollToを変更して移動できます。 エミュレータと実際のデバイスでの多数の実験の後、最適な束が見つかりました。 最初のシフトは、PaddingをPullの高さに変更してViewを更新することで行われるため、画面から非表示にします。 そして、ScrollToを変更してレイアウト全体を移動します。



美しく、可能な限りスムーズになりました。 しかし、その時点で克服できないように見える問題が発生しました。 何らかの理由で、レイアウトをシフトすると、すべてがジャンプし始めました。 座標は低くまたは高くなり、修正する方法がありませんでした。 私たちは元の計画にほとんど戻りました-プルを完成させて、ヨハン・ニルソンによってリフレッシュします。



しかし、その後、まるで魔法のように、別のプロジェクトが私の目に来ました。 同じGithubのguillepから更新するための代替プル 。 Johan Nilssonよりもさらに悪い動作をしますが、私たちのアイデアに似たまったく異なるメカニズムを使用します。 そして最も重要なことは、レイアウトのジャンプに問題があることです。 最後の3つの座標が取得され、平均が計算されます。 これにより、滑らかさが保証されます。







各プロジェクトから少しずつ取り、すべてを組み合わせて、正常に機能するプルを取得して更新しましたが、ロード状態は未完成のままでした。 リリース後、Refresh to ReleaseはLoadingに変わり、この状態ではリストとともにスクロールする必要があるため、ListViewの一部になります。 ビューを更新するための別のプルが消え、読み込み状態のビューを更新するためのプルがリストビューに追加されます。



ビューはListViewで常に表示および非表示にする必要があるため、ヘッダーとして使用することはできません。 しかし、現在のアダプターも変更したくありません。 プルを追加して作業中のプロジェクトを更新する場合、変更はできるだけ少なくする必要があります。 デコレーターとしてリフレッシュするために、Pull内で特別なアダプターを使用することにしました。 また、このアダプターは、読み込み状態の特別なビューの可用性を制御します。







特に作業中のドラフトに追加するときに多くの問題がありましたが、それらはすべて正常に解決されました。 最終的に、それは通常のListViewを置き換えることができ、更新するために適切に機能するPullを実装するクラスであることが判明しました。 バージョン1.5以降のすべてのAPIでうまく機能します。



ListViewが再設計された一部のSamsungデバイスでのみ、時々問題が発生します。 しかし、どのようにして何をやり直すことができるかというアイデアはすでにあります。



GitHubのプロジェクト



All Articles