सवाल एंड्रॉइड पुल-टू-रीफ्रेश को कैसे कार्यान्वित करें


एंड्रॉइड एप्लिकेशन जैसे कि ट्विटर (आधिकारिक ऐप) में, जब आप एक सूची दृश्य का सामना करते हैं, तो आप सामग्री को रीफ्रेश करने के लिए इसे नीचे खींच सकते हैं (और इसे रिलीज़ होने पर वापस उछाल देगा)।

मुझे आश्चर्य है कि आपकी राय में, इसे लागू करने का सबसे अच्छा तरीका क्या है?

कुछ संभावनाएं जिनके बारे में मैं सोच सकता हूं:

  1. ListView के शीर्ष पर एक आइटम - हालांकि मुझे नहीं लगता कि ListView पर एनीमेशन के साथ आइटम स्थिति 1 (0-आधारित) पर स्क्रॉल करना एक आसान काम है।
  2. ListView के बाहर एक और दृश्य - लेकिन मुझे खींचने पर सूची दृश्य स्थिति को स्थानांतरित करने की देखभाल करने की आवश्यकता है, और मुझे यकीन नहीं है कि क्या हम यह पता लगा सकते हैं कि ListView पर ड्रैग-स्पर्श अभी भी ListView पर आइटम को स्क्रॉल करते हैं या नहीं।

कोई सिफारिशें?

अनुलेख मुझे आश्चर्य है कि आधिकारिक ट्विटर ऐप स्रोत कोड कब जारी किया जाता है। यह उल्लेख किया गया है कि इसे जारी किया जाएगा, लेकिन 6 महीने बीत चुके हैं और तब से हमने इसके बारे में नहीं सुना है।


366
2018-01-03 09:51


मूल


क्या यह कार्यक्षमता गतिशील रूप से बनाए गए TableLayout में कार्यान्वित की जा सकती है। कृपया सहायता कीजिए..... - AB1209
github.com/fruitranger/PulltorefreshListView मेरा एक और कार्यान्वयन है। चिकना और बहु ​​स्पर्श समर्थन। - Changwei Yao
सम्बंधित: "पुल-टू-रीफ्रेश": एंड्रॉइड पर एंटी यूआई पैटर्न यह एक तर्क है कि यह यूआई बहस कर रहा है नहीं है कुछ ऐसा जो एंड्रॉइड पर इस्तेमाल किया जाना चाहिए और इसकी उचितता के बारे में बहुत सी चर्चा की। - blahdiblah
किसी को Google को यह बताना चाहिए क्योंकि एंड्रॉइड के लिए जीमेल का नवीनतम संस्करण इस "विरोधी पैटर्न" का उपयोग करता है। - Nick
रीफ्रेश करने के लिए खींचें (और थोड़ी देर के लिए रहा है) आईओएस और एंड्रॉइड में एक मानक अपनाया पैटर्न और यह बहुत स्वाभाविक है, इसलिए यह विरोधी पैटर्न चर्चा पुरानी है। उपयोगकर्ता इसे देखने और इस तरह व्यवहार करने की उम्मीद करेंगे। - Martin Marconcini


जवाब:


अंत में, Google ने पुल-टू-रीफ्रेश लाइब्रेरी का आधिकारिक संस्करण जारी किया!

यह कहा जाता है 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) {
    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); आपके ज़रूरत के हिसाबसे।


206
2018-04-01 13:06



क्या मैं SwipeRefreshLayout पर रंग योजना के बजाय प्रोग्रेसबार का उपयोग कर सकता हूं? - pablobaldez
अप्रैल 1 '14 - और वह एक मजाक नहीं था - aeracode
यह ओपी के सवाल का जवाब नहीं देता है। यह सरल स्वाइप-टू-रीफ्रेश है। वह पुल-टू-रीफ्रेश करने के लिए कह रहा है। 168 लोगों को यह गलत कैसे हो सकता है? इस कामकाजी उदाहरण को देखें: android-arsenal.com/details/3/4257 - Martin Erlic
उदाहरण कोड guides.codepath.com/android/Implementing-Pull-to-Refresh-Guide - david72


मैंने घटक को रीफ्रेश करने के लिए पुल को लागू करने का प्रयास किया है, यह है पूरी तरह से दूर लेकिन एक संभावित कार्यान्वयन का प्रदर्शन करता है, https://github.com/johannilsson/android-pulltorefresh

मुख्य तर्क लागू किया गया है PullToRefreshListView वह फैलता है ListViewआंतरिक रूप से यह एक हेडर व्यू का उपयोग करके स्क्रॉलिंग को नियंत्रित करता है smoothScrollBy (एपीआई स्तर 8)। विजेट अब 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"
    />

78
2018-01-11 08:02



हाय जॉन, मैंने आपका नमूना कोड डाउनलोड किया है। यह एंड्रॉइड 2.2 डिवाइस में काम किया है लेकिन 2.1 डिवाइस में काम नहीं किया है। मुझे लगता है क्योंकि यह इस्तेमाल किया smoothScrollBy विधि जो केवल 2.2 या बाद में उपलब्ध है, सही है? और क्या आपके पास इस प्रभाव को 2.1 या पुराने संस्करण में लागू करने का कोई विचार है? धन्यवाद
हां यह सही है जैसा कि मैंने उत्तर में कहा है चिकनी स्क्रॉलबी एपीआई लेवल 8 (2.2) में पेश किया गया था। मैंने अभी तक अन्य संस्करणों के लिए इसे लागू करने का एक उचित तरीका नहीं निकाला है, लेकिन मुझे लगता है कि चिकनी स्क्रॉलबी के कार्यान्वयन को बंद करना संभव है, लेकिन मुझे लगता है कि चर्चा परियोजना स्थल पर रखी जानी चाहिए, न कि स्टैक ओवरफ्लो पर? - Johan Berg Nilsson
क्या यह उद्देश्य पर है कि आईडी @ + id / android है: सूची और नहीं @android: id / list, यह अजीब लगती है? परियोजना मेरी तरफ एक मुद्रास्फीति त्रुटि फेंकता है, मैं वर्तमान में उस पर जांच कर रहा हूं ... - Mathias Conradt
मुझे ताज़ा करने के लिए खींचने के लिए यह सबसे अच्छी लाइब्रेरी है ..github.com/chrisbanes/Android-PullToRefresh। यह ListViews, ग्रिड व्यू और वेबव्यू के साथ काम करता है। लागू पैटर्न को ताज़ा करने के लिए भी खींच लिया है। - rOrlig
Intellij Idea पर काम करते समय मैं प्रोजेक्ट को लाइब्रेरी फ़ोल्डर में कैसे जोड़ूं? कोई भी मेरी मदद कर सकता हैं? - Mustafa Güven


मैंने एंड्रॉइड के लिए एक मजबूत, ओपन सोर्स, उपयोग करने में आसान और अत्यधिक अनुकूलन PullToRefresh लाइब्रेरी भी लागू की है। प्रोजेक्ट पेज पर प्रलेखन में वर्णित अनुसार आप अपनी ListView को PullToRefreshListView के साथ प्रतिस्थापित कर सकते हैं।

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


52
2018-01-07 02:03



मैंने यहां सूचीबद्ध सभी कार्यान्वयनों की कोशिश की और कार्यान्वयन को ताज़ा करने के लिए एक सरल / शुद्ध / चिकनी खींच के संदर्भ में आपका सबसे अच्छा है (जोहान की तरह अजीबता को ताज़ा करने के लिए कोई टैप नहीं)। धन्यवाद! - Gady
क्या यह ListActivity, ListFragment आदि के साथ काम करने के लिए मानक सूची दृश्य को प्रतिस्थापित कर सकता है? - davidcesarino
हां, बस PullToRefreshList सही आईडी देखें। एक्सएमएल में: एंड्रॉइड: आईडी = "@ एंड्रॉइड: आईडी / सूची" - Erik
यह बिल्कुल कमाल है! गूगल ने मुझे यहां लाया, और उदाहरणों को देखकर, आप को लागू करने के लिए सबसे आसान लग रहा है। ब्रावो और धन्यवाद श्रीमान! - Evan R.
बहुत समझदार रूप से डिजाइन घटक, अच्छा और सरल। यह निश्चित रूप से स्वीकृत उत्तर होना चाहिए। - Adam


एंड्रॉइड समर्थन लाइब्रेरी द्वारा प्रदान किया जाने वाला सबसे आसान तरीका है:

android.support.v4.widget.SwipeRefreshLayout;

एक बार आयात किए जाने के बाद आप निम्नानुसार अपना लेआउट परिभाषित कर सकते हैं:

  <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/refresh"
        android:layout_height="match_parent"
        android:layout_width="match_parent">
    <android.support.v7.widget.RecyclerView
        xmlns:recycler_view="http://schemas.android.com/apk/res-auto"
        android:id="@android:id/list"
        android:theme="@style/Theme.AppCompat.Light"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/button_material_light"
        >

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

मुझे लगता है कि आप सूचीदृश्य के बजाय रीसाइक्लिंग दृश्य का उपयोग करते हैं। हालांकि, सूचीदृश्य अभी भी काम करता है ताकि आपको सूचीदृश्य के साथ रीसाइक्लिंगव्यू को प्रतिस्थापित करने और जावा कोड (खंड) में संदर्भों को अपडेट करने की आवश्यकता हो।

आपकी गतिविधि खंड में, आप पहले इंटरफेस को लागू करते हैं, SwipeRefreshLayout.OnRefreshListener: अर्थात

public class MySwipeFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener{
private SwipeRefreshLayout swipeRefreshLayout;

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_item, container, false);
        swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refresh);
        swipeRefreshLayout.setOnRefreshListener(this);
}


 @Override
  public void onRefresh(){
     swipeRefreshLayout.setRefreshing(true);
     refreshList();
  }
  refreshList(){
    //do processing to get new data and set your listview's adapter, maybe  reinitialise the loaders you may be using or so
   //when your data has finished loading, cset the refresh state of the view to false
   swipeRefreshLayout.setRefreshing(false);

   }
}

उम्मीद है कि यह जनता की मदद करता है


35
2018-06-15 18:28



यह अच्छा काम करता है। हालांकि, एक बात के बारे में setRefreshing: जैसा कि वर्णन किया गया है, "स्वाइप जेस्चर द्वारा रीफ्रेश ट्रिगर होने पर इसे कॉल न करें" developer.android.com/reference/android/support/v4/widget/... - gabriel14
बिल्कुल सही काम करता है .. धन्यवाद दोस्त .. - Roy Miller
iu पुरुष = डी धन्यवाद - Mike Brian Olivera
बहुत बढ़िया! धन्यवाद। - technik


इस लिंक में, आप प्रसिद्ध का कांटा पा सकते हैं PullToRefresh देखें कि इसमें नए दिलचस्प कार्यान्वयन हैं PullTorRefreshWebView या PullToRefreshGridView या एक जोड़ने की संभावना है PullToRefreshएक सूची के नीचे किनारे पर।

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

और सबसे अच्छा यह है कि एंड्रॉइड 4.1 में सही काम (सामान्य PullToRefresh काम नहीं करता है)


21
2018-06-14 10:11



रीडमी के शीर्ष पर एक बड़ी टिप्पणी इंगित करती है: इस परियोजना को लंबे समय तक स्थापित नहीं किया जा रहा है। वैसे भी, यह lib अब तक का सबसे अच्छा देखा है! अच्छा कार्य! - Milton
सिर्फ इसलिए कि यह अब बनाए रखा नहीं जा रहा है, इसका मतलब यह नहीं है कि यह अच्छा नहीं है। जरूरतों को ताज़ा करने के लिए अभी भी मेरे सभी खींचने के लिए इसका उपयोग करें :) - Muz


मेरे पास ऐसा करने का बहुत आसान तरीका है लेकिन अब यह मूर्खतापूर्ण तरीका है मेरा कोड है 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;
    }
}

आपको अपनी गतिविधि पर 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");
    }
}

इससे मेरा काम बनता है :)


18
2017-11-27 11:45



यह काम करता हैं। इस सरल समाधान के लिए धन्यवाद। - Rexb


एंड्रॉइड पुल-टू-रीफ्रेश को लागू करने के लिए कोड के इस टुकड़े को आजमाएं,

<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);

 }

18
2018-05-20 08:51



धन्यवाद। वास्तव में मेरी मदद की - Arpan Sharma


किसी ने भी "रीफ्रेश करने के लिए पुल" का नया प्रकार उल्लेख नहीं किया है जो Google नाओ या जीमेल एप्लिकेशन जैसे एक्शन बार के शीर्ष पर दिखाता है।

एक पुस्तकालय है ActionBar-PullToRefresh जो बिल्कुल वही काम करता है।


9
2017-12-21 11:10





ध्यान दें कि एंड्रॉइड और डब्ल्यूपी पर लागू होने पर संघर्ष करने के लिए यूएक्स मुद्दे हैं।

"डिजाइनरों / देवताओं को स्टाइल आईओएस ऐप्स में पुल-टू-रीफ्रेश को लागू नहीं करना चाहिए, इस बारे में एक महान संकेतक यह है कि Google और उनकी टीम कभी भी आईओएस में इसका उपयोग करते समय एंड्रॉइड पर पुल-टू-रीफ्रेश का उपयोग नहीं करतीं।"

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


7
2017-11-01 20:12



मुझे पता है कि यह एक साल पुराना है लेकिन जीमेल ऐप पुल-टू-रीफ्रेश का उपयोग करता है। हालांकि यह यूआई के संदर्भ में बिल्कुल समान नहीं है, इसलिए स्क्रीन स्क्रॉल नहीं होती है, बल्कि स्क्रीन के शीर्ष पर एक नया दृश्य दिखाता है। - ashishduh


यदि आप नहीं चाहते हैं कि आपका प्रोग्राम एक आईफोन प्रोग्राम जैसा दिखता है जो एंड्रॉइड में लगाया गया है, तो अधिक देशी दिखने और महसूस करने का लक्ष्य रखें और जिंजरब्रेड के समान कुछ करें:

alt text


4
2018-01-05 14:34



@ रोब: मेरा मतलब है कि जब आप आईफोन पर वापस उछालते हैं, तो सूची में शीर्ष पर नारंगी छाया होती है। यह एक टिप्पणी के रूप में है (उत्तर नहीं), लेकिन टिप्पणियों में छवियां नहीं हो सकती हैं। - Lie Ryan
आह, क्षमा करें, महान विचार। मैंने जिंजरब्रेड के साथ अभी तक नहीं खेला है, इसलिए प्रभाव नहीं देखा था। फिर भी Google को इसे नेक्सस में घुमाने के लिए इंतजार कर रहा है। - Rob
मेरे पास जिंजरब्रेड है और नारंगी चमक बहुत अच्छी तरह काम करती है जब एक सूची स्थैतिक होती है। लेकिन एक गतिशील सूची रीफ्रेश करने के लिए पुल-डाउन-रीफ्रेश एक महान यूआई मेकनिज्म है। हालांकि यह आईओएस दुनिया में प्रचलित है, यह एक यूआई चाल है जो एंड्रॉइड पारिस्थितिकी तंत्र में डर नहीं लगती है। मैं दृढ़ता से सुझाव देता हूं कि आप इसे आधिकारिक ट्विटर ऐप में देखें। :) - Thierry-Dimitri Roy
यहां मूल व्यवहार यह इंगित करना है कि आप एक सूची के अंत तक पहुंच गए हैं। इसे लेना, और रीफ्रेश करना समान रूप से गैर देशी है क्योंकि आप प्लेटफ़ॉर्म क्या नहीं कर रहे हैं। इसका मतलब है कि आप उपयोगकर्ता को आश्चर्यचकित करने की अधिक संभावना रखते हैं। मैं निश्चित रूप से उम्मीद नहीं करता और न ही ताज़ा करना चाहता हूं क्योंकि मुझे एक सूची के अंत तक पहुंच गया था। ताज़ा करने के लिए नीचे खींचें बहुत अधिक सहज और स्पष्ट है। और जैसा कि मूल ट्विटर ऐप इसका उपयोग करता है, मुझे लगता है कि यह कहना उचित है कि यह एक यूआई अवधारणा है जिसमें बड़ी संख्या में लोग परिचित हैं। - steprobe