469

Twitter (公式アプリ) などの Android アプリケーションでは、ListView に遭遇すると、それをプルダウン (離すと元に戻ります) してコンテンツを更新できます。

あなたの意見では、それを実装するための最良の方法は何ですか?

私が考えることができるいくつかの可能性:

  1. ListView の上の項目 - ただし、ListView のアニメーションで項目位置 1 (0 ベース) にスクロールして戻るのは簡単な作業ではないと思います。
  2. ListView の外にある別のビュー - しかし、ListView がプルされたときに ListView の位置を下に移動するように注意する必要があります。ListView へのドラッグ タッチがまだ ListView の項目を実際にスクロールしているかどうかを検出できるかどうかはわかりません。

推奨事項はありますか?

PS公式Twitterアプリのソースコードはいつ公開されるのかな。発売されるとのことでしたが、6ヶ月が経ちますが、その後何の連絡もありません。

4

16 に答える 16

367

最後に、Google は pull-to-refresh ライブラリの公式バージョンをリリースしました!

SwipeRefreshLayoutサポートライブラリ内で呼び出され、ドキュメントは次のとおりです。

  1. SwipeRefreshLayoutレイアウトを更新するためのプルとして扱われるビューの親として追加します。(私はListView例として取り上げました、それはのようViewなものLinearLayoutですScrollView。)

     <android.support.v4.widget.SwipeRefreshLayout
         android:id="@+id/pullToRefresh"
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
         <ListView
             android:id="@+id/listView"
             android:layout_width="match_parent"
             android:layout_height="match_parent"/>
     </android.support.v4.widget.SwipeRefreshLayout>
    
  2. クラスにリスナーを追加する

     protected void onCreate(Bundle savedInstanceState) {
         final SwipeRefreshLayout pullToRefresh = findViewById(R.id.pullToRefresh);
         pullToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
             @Override
             public void onRefresh() {
                 refreshData(); // your code
                 pullToRefresh.setRefreshing(false);
             }
         });
     }
    

ご要望に応じてお電話もpullToRefresh.setRefreshing(true/false);承ります。

アップデート

Android サポート ライブラリは廃止され、AndroidX に置き換えられました。新しいライブラリへのリンクは、ここにあります。

また、プロジェクトに次の依存関係を追加する必要があります。

implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'

また

Refactor>>Migrate to AndroidX に移動すると、Android Studio が依存関係を処理します。

于 2014-04-01T13:06:56.590 に答える
80

コンポーネントを更新するためのプルを実装しようとしましたが、完全にはほど遠いですが、可能な実装を示しています https://github.com/johannilsson/android-pulltorefresh

メインロジックはPullToRefreshListViewextendsで実装されていますListView内部的には、 (API レベル 8)を使用してヘッダー ビューのスクロールを制御します。smoothScrollByウィジェットは現在、1.5 以降のサポートで更新されていますが、1.5 のサポートについては README をお読みください。

レイアウトでは、このように追加するだけです。

<com.markupartist.android.widget.PullToRefreshListView
    android:id="@+id/android:list"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    />
于 2011-01-11T08:02:22.500 に答える
55

また、堅牢でオープン ソースの、使いやすく高度にカスタマイズ可能な Android 用の PullToRefresh ライブラリも実装しました。プロジェクト ページのドキュメントで説明されているように、ListView を PullToRefreshListView に置き換えることができます。

https://github.com/erikwt/PullToRefresh-ListView

于 2012-01-07T02:03:24.933 に答える
23

このリンクでは、またはリストの下端にa を追加する可能性PullToRefreshなどの新しい興味深い実装を持つ有名なビューのフォークを見つけることができます。PullTorRefreshWebViewPullToRefreshGridViewPullToRefresh

https://github.com/chrisbanes/Android-PullToRefresh

そして、それの最高は、Android 4.1 で完璧に動作することです (通常PullToRefreshは動作しません) 。

于 2012-06-14T10:11:18.203 に答える
19

Android の Pull-to-Refresh を実装するには、次のコードを試してください。

<android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/pullToRefresh"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

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

活動クラス:

ListView lv = (ListView) findViewById(R.id.lv);
SwipeRefreshLayout pullToRefresh = (SwipeRefreshLayout) findViewById(R.id.pullToRefresh);


lv.setAdapter(mAdapter);

pullToRefresh.setOnRefreshListener(new OnRefreshListener() {

        @Override
        public void onRefresh() {
            // TODO Auto-generated method stub

            refreshContent();

        }
    });



private void refreshContent(){ 

     new Handler().postDelayed(new Runnable() {
            @Override public void run() {
                pullToRefresh.setRefreshing(false);
            }
        }, 5000);

 }
于 2015-05-20T08:51:10.633 に答える
18

私はこれを行う非常に簡単な方法がありますが、今では絶対確実な方法です私のコードPullDownListView.javaがあります

package com.myproject.widgets;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;

/**
 * @author Pushpan
 * @date Nov 27, 2012
 **/
public class PullDownListView extends ListView implements OnScrollListener {

    private ListViewTouchEventListener mTouchListener;
    private boolean pulledDown;

    public PullDownListView(Context context) {
        super(context);
        init();
    }

    public PullDownListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public PullDownListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        setOnScrollListener(this);
    }

    private float lastY;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            lastY = ev.getRawY();
        } else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
            float newY = ev.getRawY();
            setPulledDown((newY - lastY) > 0);
            postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (isPulledDown()) {
                        if (mTouchListener != null) {
                            mTouchListener.onListViewPulledDown();
                            setPulledDown(false);
                        }
                    }
                }
            }, 400);
            lastY = newY;
        } else if (ev.getAction() == MotionEvent.ACTION_UP) {
            lastY = 0;
        }
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        setPulledDown(false);
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }

    public interface ListViewTouchEventListener {
        public void onListViewPulledDown();
    }

    public void setListViewTouchListener(
            ListViewTouchEventListener touchListener) {
        this.mTouchListener = touchListener;
    }

    public ListViewTouchEventListener getListViewTouchListener() {
        return mTouchListener;
    }

    public boolean isPulledDown() {
        return pulledDown;
    }

    public void setPulledDown(boolean pulledDown) {
        this.pulledDown = pulledDown;
    }
}

このListViewを使用してリスナーを設定するアクティビティにListViewTouchEventListenerを実装する必要があります。

PullDownListViewActivityに実装しています

package com.myproject.activities;

import android.app.Activity;
import android.os.Bundle;

/**
 * @author Pushpan
 *
 */
public class PullDownListViewActivity extends Activity implements ListViewTouchEventListener {

    private PullDownListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        listView = new PullDownListView(this);
        setContentView(listView);
        listView.setListViewTouchListener(this);

        //setItems in listview
    }

    public void onListViewPulledDown(){
        Log.("PullDownListViewActivity", "ListView pulled down");
    }
}

わたしにはできる :)

于 2012-11-27T11:45:02.820 に答える
7

Android および WP に実装する場合は、対処すべき UX の問題があることに注意してください。

「デザイナー/開発者がiOSアプリのスタイルでプルツーリフレッシュを実装すべきではない理由の優れた指標は、GoogleとそのチームがプルツーリフレッシュをiOSでは使用しているのに、Androidでは決して使用しないことです。」

https://plus.google.com/109453683460749241197/posts/eqYxXR8L4eb

于 2012-11-01T20:12:02.210 に答える
4

ここでコンポーネントを更新するためのプルを作成しました: https://github.com/guillep/PullToRefresh リストに項目がない場合に動作し、1.6 以上の Android 携帯でテストしました。

どんな提案や改善も大歓迎です:)

于 2011-07-30T20:05:21.840 に答える
4

プログラムを Android に強制的に組み込まれた iPhone プログラムのように見せたくない場合は、よりネイティブなルック アンド フィールを目指して、Gingerbread に似た処理を行います。

代替テキスト

于 2011-01-05T14:34:28.440 に答える
1

Yalantisによる非常に興味深いPull-to-Refresh。iOS用のGifですが、確認できます:)

<com.yalantis.pulltorefresh.library.PullToRefreshView
android:id="@+id/pull_to_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
    android:id="@+id/list_view"
    android:divider="@null"
    android:dividerHeight="0dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

于 2015-01-19T13:42:39.987 に答える