You might have noticed that lot of android apps like Twitter, Google+ provides an option to swipe / pull down to refresh it’s content. Whenever user swipes down from top, a loader will be shown and will disappear once the new content is loaded. In this tutorial we are going to learn how to provide the same option to your apps too.

Previously we used to implement a custom swipe view to detect the swipe down. But android made our day easier by introducing SwipeRefreshLayout in android.support.v4 to detect the vertical swipe on any view.

android-swipe-down-to-refresh-list-view-tutorial

1. Android SwipeRefreshLayout

Implementing SwipeRefreshLayout is very easy. Whenever you want to detect the swipe down on any view, just the wrap the view around SwipeRefreshLayout element. In our case, we are going to use it with ListView. And implement your activity class from SwipeRefreshLayout.OnRefreshListener. When user swipes down the view, onRefresh() method will be triggered. In you need to take appropriate action in that function like making an http call and fetch the latest data.

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipe_refresh_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <!-- place your view here -->

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

2. Example JSON

To demonstrate this tutorial, I am showing IMDB top 250 movies in a List View. For this I have created a json service which gives 20 movies in each request. You need to pass offset param to get the next set of results. Initially offset value should be 0, whenever the list is swiped down, we make an http call to get the next 20 movies and will update the ListView.

URL: https://api.androidhive.info/json/imdb_top_250.php?offset=0

3. Creating Android Project

1. In Android Studio, create a new project by navigating to File ⇒ New Project and fill all the required details. When it prompts to select a default activity, select Blank Activity and proceed.

2. Open build.gradle located under app folder and add volley library dependency. We are going to use volley to make HTTP calls to fetch the json.

com.mcxiaoke.volley:library-aar:1.0.0

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.0'
    compile 'com.mcxiaoke.volley:library-aar:1.0.0'
}

3. Open colors.xml under res ⇒ values and add below color resources. If you don’t find colors.xml, create a new file with the name. The color resources added below are used to set background color for movies rank in list view.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="movie_serial_bg">
        <item>#24c6d5</item>
        <item>#57dd86</item>
        <item>#ad7dcf</item>
        <item>#ff484d</item>
        <item>#fcba59</item>
        <item>#24c6d5</item>
    </string-array>
</resources>

3. Now under your project’s package, create three packages named app, activity and helper.

4. Under app package, create a class named MyApplication.java and add below code. This is a singleton Application class which initiates volley core objects on app launch.

package info.androidhive.swiperefresh.app;

import android.app.Application;
import android.text.TextUtils;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

/**
 * Created by Ravi on 13/05/15.
 */

public class MyApplication extends Application {

    public static final String TAG = MyApplication.class
            .getSimpleName();

    private RequestQueue mRequestQueue;

    private static MyApplication mInstance;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }

    public static synchronized MyApplication getInstance() {
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(getApplicationContext());
        }

        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req, String tag) {
        req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
        getRequestQueue().add(req);
    }

    public <T> void addToRequestQueue(Request<T> req) {
        req.setTag(TAG);
        getRequestQueue().add(req);
    }

    public void cancelPendingRequests(Object tag) {
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(tag);
        }
    }
}

5. Open AndroidManifest.xml and add MyApplication.java class to <application> tag. Also you need to add INTERNET permission as we need to make http calls.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="info.androidhive.swiperefresh">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:name=".app.MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".activity.MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

6. Now let’s create a custom adapter class for our list view. Under res ⇒ layout folder, create an xml layout named list_row.xml. This xml renders single list row in the ListView.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/serial"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="25dp"
        android:layout_margin="5dp"
        android:layout_alignParentLeft="true"
        android:textSize="20dp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/title"
        android:layout_toRightOf="@id/serial"
        android:layout_centerVertical="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textStyle="bold"
        android:paddingLeft="20dp"
        android:textSize="18dp" />

</RelativeLayout>

7. Under helper package, create a java class named Movie.java and add below code. This is a model class required to create movie objects to provide data to the List View

package info.androidhive.swiperefresh.helper;

/**
 * Created by Ravi on 13/05/15.
 */
public class Movie {
    public int id;
    public String title;

    public Movie() {
    }

    public Movie(int id, String title) {
        this.title = title;
        this.id = id;
    }
}

8. Under helper package, create another class named SwipeListAdapter.java. This class is a custom adapter class which inflates the list_row.xml by applying proper data.

package info.androidhive.swiperefresh.helper;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;

import info.androidhive.swiperefresh.R;

/**
 * Created by Ravi on 13/05/15.
 */
public class SwipeListAdapter extends BaseAdapter {
    private Activity activity;
    private LayoutInflater inflater;
    private List<Movie> movieList;
    private String[] bgColors;

    public SwipeListAdapter(Activity activity, List<Movie> movieList) {
        this.activity = activity;
        this.movieList = movieList;
        bgColors = activity.getApplicationContext().getResources().getStringArray(R.array.movie_serial_bg);
    }

    @Override
    public int getCount() {
        return movieList.size();
    }

    @Override
    public Object getItem(int location) {
        return movieList.get(location);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (inflater == null)
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
            convertView = inflater.inflate(R.layout.list_row, null);

        TextView serial = (TextView) convertView.findViewById(R.id.serial);
        TextView title = (TextView) convertView.findViewById(R.id.title);

        serial.setText(String.valueOf(movieList.get(position).id));
        title.setText(movieList.get(position).title);

        String color = bgColors[position % bgColors.length];
        serial.setBackgroundColor(Color.parseColor(color));

        return convertView;
    }

}

10. Now we have all the required files in place, let’s start implementing the actual swipe refresh view. Open the layout file of your main activity (activity_main.xml) and modify the layout as shown below. I have added a ListView to show list of movies and wrapped it around SwipeRefreshLayout to get the swipe to refresh.

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swipe_refresh_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ListView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView">

    </ListView>

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

11. Finally open MainActivity.java and do the below changes to achieve the swipe refresh list view.

> Implement the activity from SwipeRefreshLayout.OnRefreshListener and override the onRefresh() method.

> Call fetchMovies() which is a volley’s json array call to fetch the json and update the list view.

> onRefresh() is triggered whenever user swipes down the view. So call fetchMovies() inside this method to get the next set of movies response.

package info.androidhive.swiperefresh.activity;

import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.widget.ListView;
import android.widget.Toast;

import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

import info.androidhive.swiperefresh.R;
import info.androidhive.swiperefresh.app.MyApplication;
import info.androidhive.swiperefresh.helper.Movie;
import info.androidhive.swiperefresh.helper.SwipeListAdapter;


public class MainActivity extends ActionBarActivity implements SwipeRefreshLayout.OnRefreshListener {

    private String TAG = MainActivity.class.getSimpleName();

    private String URL_TOP_250 = "https://api.androidhive.info/json/imdb_top_250.php?offset=";

    private SwipeRefreshLayout swipeRefreshLayout;
    private ListView listView;
    private SwipeListAdapter adapter;
    private List<Movie> movieList;

    // initially offset will be 0, later will be updated while parsing the json
    private int offSet = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (ListView) findViewById(R.id.listView);
        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);

        movieList = new ArrayList<>();
        adapter = new SwipeListAdapter(this, movieList);
        listView.setAdapter(adapter);

        swipeRefreshLayout.setOnRefreshListener(this);

        /**
         * Showing Swipe Refresh animation on activity create
         * As animation won't start on onCreate, post runnable is used
         */
        swipeRefreshLayout.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        swipeRefreshLayout.setRefreshing(true);

                                        fetchMovies();
                                    }
                                }
        );

    }

    /**
     * This method is called when swipe refresh is pulled down
     */
    @Override
    public void onRefresh() {
        fetchMovies();
    }

    /**
     * Fetching movies json by making http call
     */
    private void fetchMovies() {

        // showing refresh animation before making http call
        swipeRefreshLayout.setRefreshing(true);

        // appending offset to url
        String url = URL_TOP_250 + offSet;

        // Volley's json array request object
        JsonArrayRequest req = new JsonArrayRequest(url,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d(TAG, response.toString());

                        if (response.length() > 0) {

                            // looping through json and adding to movies list
                            for (int i = 0; i < response.length(); i++) {
                                try {
                                    JSONObject movieObj = response.getJSONObject(i);

                                    int rank = movieObj.getInt("rank");
                                    String title = movieObj.getString("title");

                                    Movie m = new Movie(rank, title);

                                    movieList.add(0, m);

                                    // updating offset value to highest value
                                    if (rank >= offSet)
                                        offSet = rank;

                                } catch (JSONException e) {
                                    Log.e(TAG, "JSON Parsing error: " + e.getMessage());
                                }
                            }

                            adapter.notifyDataSetChanged();
                        }

                        // stopping swipe refresh
                        swipeRefreshLayout.setRefreshing(false);

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, "Server Error: " + error.getMessage());

                Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();

                // stopping swipe refresh
                swipeRefreshLayout.setRefreshing(false);
            }
        });

        // Adding request to request queue
        MyApplication.getInstance().addToRequestQueue(req);
    }

}

Run the project and test it. You should able see the swipe refresh animation on app launch and list view updated each time you swipe down it.

android swipe down to refresh listview

4. PHP Class to Generate JSON

As lot of people are requesting me to provide the PHP code to generate the json, I am giving the code to generate the json used in this article. You can run this code using WAMP or XAMP softwares. Checkout Video 1 and Video 2 for installation and running PHP project in WAMP.

<?php

// sleep for 2 sec show that the androd swipe refresh will be visible for sometime
sleep(2);

// all top 250 movies
$movies = array("The Shawshank Redemption", "The Godfather", "The Godfather: Part II", "The Dark Knight", "Pulp Fiction", "Schindler's List", "12 Angry Men", "The Good, the Bad and the Ugly", "The Lord of the Rings: The Return of the King", "Fight Club", "The Lord of the Rings: The Fellowship of the Ring", "Star Wars: Episode V - The Empire Strikes Back", "Forrest Gump", "Inception", "One Flew Over the Cuckoo's Nest", "The Lord of the Rings: The Two Towers", "Goodfellas", "The Matrix", "Star Wars", "Seven Samurai", "City of God", "Se7en", "The Usual Suspects", "The Silence of the Lambs", "It's a Wonderful Life", "Interstellar", "Léon: The Professional", "Life Is Beautiful", "Once Upon a Time in the West", "Casablanca", "American History X", "Saving Private Ryan", "Spirited Away", "Raiders of the Lost Ark", "City Lights", "Psycho", "Rear Window", "The Intouchables", "Whiplash", "Modern Times", "The Green Mile", "Terminator 2: Judgment Day", "Memento", "The Pianist", "The Departed", "Apocalypse Now", "Gladiator", "Sunset Blvd.", "Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb", "Back to the Future", "Alien", "The Prestige", "The Lion King", "The Great Dictator", "The Lives of Others", "Cinema Paradiso", "Django Unchained", "The Shining", "Paths of Glory", "The Dark Knight Rises", "American Beauty", "WALL·E", "North by Northwest", "Aliens", "Citizen Kane", "Grave of the Fireflies", "Vertigo", "M", "Oldboy", "Das Boot", "Amélie", "Princess Mononoke", "Star Wars: Episode VI - Return of the Jedi", "Once Upon a Time in America", "Toy Story 3", "Reservoir Dogs", "A Clockwork Orange", "Braveheart", "Taxi Driver", "Double Indemnity", "Witness for the Prosecution", "Requiem for a Dream", "To Kill a Mockingbird", "Lawrence of Arabia", "Eternal Sunshine of the Spotless Mind", "Full Metal Jacket", "Bicycle Thieves", "The Sting", "Singin' in the Rain", "Amadeus", "Monty Python and the Holy Grail", "Snatch.", "2001: A Space Odyssey", "For a Few Dollars More", "Rashomon", "L.A. Confidential", "The Kid", "All About Eve", "The Apartment", "Inglourious Basterds", "Toy Story", "The Treasure of the Sierra Madre", "A Separation", "Indiana Jones and the Last Crusade", "Yojimbo", "The Third Man", "Some Like It Hot", "Metropolis", "Batman Begins", "Unforgiven", "Scarface", "Like Stars on Earth", "Raging Bull", "Up", "3 Idiots", "Downfall", "Chinatown", "The Great Escape", "Die Hard", "The Hunt", "On the Waterfront", "Heat", "Mr. Smith Goes to Washington", "Pan's Labyrinth", "Good Will Hunting", "The Bridge on the River Kwai", "My Neighbor Totoro", "Ikiru", "The Seventh Seal", "The Gold Rush", "Ran", "Wild Strawberries", "The General", "Blade Runner", "The Elephant Man", "Lock, Stock and Two Smoking Barrels", "The Secret in Their Eyes", "The Wolf of Wall Street", "Casino", "Gran Torino", "Howl's Moving Castle", "Warrior", "The Big Lebowski", "V for Vendetta", "Rebecca", "The Bandit", "Gone Girl", "The Deer Hunter", "Judgment at Nuremberg", "Cool Hand Luke", "How to Train Your Dragon", "It Happened One Night", "Fargo", "A Beautiful Mind", "Gone with the Wind", "Trainspotting", "Into the Wild", "Rush", "Dial M for Murder", "The Maltese Falcon", "The Sixth Sense", "Mary and Max", "Finding Nemo", "The Thing", "The Wages of Fear", "Hotel Rwanda", "No Country for Old Men", "Incendies", "Rang De Basanti", "Kill Bill: Vol. 1", "Platoon", "Life of Brian", "Butch Cassidy and the Sundance Kid", "Network", "A Wednesday", "Munna Bhai M.B.B.S.", "Touch of Evil", "There Will Be Blood", "12 Years a Slave", "Annie Hall", "The 400 Blows", "Stand by Me", "The Princess Bride", "Persona", "The Grand Budapest Hotel", "Amores Perros", "Ben-Hur", "Diabolique", "In the Name of the Father", "The Grapes of Wrath", "Million Dollar Baby", "Sin City", "Hachi: A Dog's Tale", "Nausicaä of the Valley of the Wind", "The Wizard of Oz", "The Best Years of Our Lives", "Gandhi", "The Avengers", "The Bourne Ultimatum", "Donnie Darko", "Shutter Island", "Stalker", "8½", "Guardians of the Galaxy", "Strangers on a Train", "Infernal Affairs", "Twelve Monkeys", "Fanny and Alexander", "Before Sunrise", "Boyhood", "Jaws", "The Imitation Game", "The Battle of Algiers", "The Terminator", "High Noon", "Groundhog Day", "Harry Potter and the Deathly Hallows: Part 2", "Memories of Murder", "The King's Speech", "Ip Man", "Monsters, Inc.", "Notorious", "Rocky", "Dog Day Afternoon", "Barry Lyndon", "La Haine", "The Truman Show", "Who's Afraid of Virginia Woolf?", "A Fistful of Dollars", "Dil Chahta Hai", "The Night of the Hunter", "Pirates of the Caribbean: The Curse of the Black Pearl", "Lagaan: Once Upon a Time in India", "Castle in the Sky", "Jurassic Park", "X-Men: Days of Future Past", "La Strada", "The Help", "Roman Holiday", "Wild Tales", "The Big Sleep", "Spring, Summer, Fall, Winter... and Spring", "Le Samouraï", "Prisoners", "Underground", "The Graduate", "Paris, Texas", "Solaris", "Three Colors: Red", "Papillon");

// reading offset from get parameter
$offset = isset($_GET['offset']) && $_GET['offset'] != '' ? $_GET['offset'] : 0;

// page limit
$limit = 20;


$movies_array = array();

// loop through page movies
for ($j = $offset; $j < $offset + $limit && $j < sizeof($movies); $j++) {
    $tmp = array();
    $tmp['rank'] = $j + 1;
    $tmp['title'] = $movies[$j];

    array_push($movies_array, $tmp);
}

// printing json response
echo json_encode($movies_array);
?>
Subscribe
Notify of
guest
187 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
msandroid
5 years ago

nice

Aw Oo
Aw Oo
5 years ago

can you give me example of acces url = domain.com/example.php without param offset or anything?. an example my url above, return result from db like this = [ { “id”: “1”, “nama”: “Nasi Goreng Beringharjo” }, { “id”: “2”, “nama”: “Gudeg Pawon”} ] .

Arjun
Arjun
5 years ago

Nice one .
Hi Ravi, can you please tell me what are handlers , loaders and adapters in android and what are they used for . I read the documentations from developer site but couldn’t understand them. Please help. Thank you

Sithu
Sithu
5 years ago

Nice Tutorial,
Hi Ravi, this is the swipe down to refresh function. I want to know the swipe up to refresh list view. Please help . Thanks.

Dharmik
Dharmik
5 years ago

Ravi, Doing a Great Job 🙂

slim
slim
5 years ago

nice work

xxx
xxx
5 years ago

hmmmm

Sad And Smile
Sad And Smile
5 years ago

i am getting Index out of bound exception when I tap pull down refresh for multiple times. Can u tell me how to fix it?

Игорь
Игорь
5 years ago

Прекрасно! Спасибо за Ваши уроки, как всегда все отлично работает.

Ravi Tamada
5 years ago
Reply to  Игорь

Добро пожаловать 🙂

Andra Galih
Andra Galih
5 years ago

New Fans here.. Always Awesome Tutorial Article.. Keep Up The Good Work…

Ravi Tamada
5 years ago
Reply to  Andra Galih

Thanks Andra Galih 🙂

sapamlucy
sapamlucy
5 years ago

i follow ur blogs n i learnt android programming using ur blogs only n it has been fun.. but somehow this inclusion of php has been hard to follow because i dont knw php… i hope, though it might be essential to use php , u provide articals which uses uses solely java…(in scenarios like this so that we know how it done.. if thats not asking too much). thanks for sharing ur knowledge

Ravi Tamada
5 years ago
Reply to  sapamlucy

Hi Sapamlucy,

Actually I can build the same in java too instead of PHP, but hosting java servers are costlier than PHP. That’s why I always wanted to give server side part in PHP. May be from next time onwards I should prefer giving everything in java.

Cheers!

sapamlucy
sapamlucy
5 years ago
Reply to  Ravi Tamada

I realize u have a valid point here but Thank u for considering my suggestion !!

Trey Rosius
Trey Rosius
5 years ago

Simple and straight forward…Thanks Ravi. I’de already implemented this in an app, but i still dig your implementation…Great Work

Ahmad Alkhateeb
5 years ago

inside onRefresh() the fetchMovies() method should be in Handler to avoid errors when you click on any item in listView or RecycleView and Stop it ..

thank u nice Tutorial @_@ ;

Ravi Tamada
5 years ago

Thanks Ahmad for your tip 🙂

erhan harmankaya
erhan harmankaya
4 years ago

hi how can we change the code ?

Jaymo Left Brained
Jaymo Left Brained
5 years ago

Just an extra tip, you can customize the SwipeRefreshLayout’s animated loader

swipeRefreshLayout.setColorSchemeResources(R.color.blue,R.color.red);

Roshan W
Roshan W
5 years ago

Please Add Tutorial For SwipeRefreshLayout Like Gmail

Ref: http://antonioleiva.com/swiperefreshlayout/

&

http://www.touchmeco.tk/android-swipe-down-to-refresh-now-easy-with-swiperefreshlayout

Tried Above But Not Working !

Karthik
Karthik
5 years ago

Very clear and simply explained. Thanks..

Renitto Jose
Renitto Jose
5 years ago

Thank you for the Tutorial . Can you Please Provide a Tutorial about ShowCaseView library With a Sample .

Renitto Jose
Renitto Jose
5 years ago

How to Provide a Zooming Effect for the SwipeRefreshLayout like in Drippler App .
https://play.google.com/store/apps/details?id=com.drippler.android.updates&hl=en

Mohammad
Mohammad
5 years ago

Ravi, Doing a Great Job 🙂

Ravi Tamada
5 years ago
Reply to  Mohammad

Thank You 🙂

Raja Veeramani
Raja Veeramani
5 years ago

Hi Ravi, You are doing a great job. Very informative.
Would you be available to work on a side project? Thanks!

Akshay
Akshay
5 years ago

it will get triggerred whenever i scroll down from my list view. Is is possible to activate it only from the top of the list. thanks

Shifar Shifz
5 years ago

Ravi, i’ve a request. Could please make some tutorial about creating `Custom Views` in Android.

ravi
ravi
5 years ago
Reply to  Shifar Shifz

ok keep updatng.

Ghed Oneraj
Ghed Oneraj
5 years ago

Please Add Live Wallpaper tutorial,Using .gif file Or on Particular Time Wallpaper Autometically change Wallpaper

ravi
ravi
5 years ago
Reply to  Ghed Oneraj

ok

Muhammad Faridh Djamalilleil
Muhammad Faridh Djamalilleil
5 years ago

Hey Ravi, I have been developing android app using view pager and material design navigation drawer and I want to use SwipeRefreshLayout in some of my fragment classes that retrieve data from database server. Can I make it on Fragment as main class? if can how do I have to change the adapter class and use data from database? Thanks in advance. Cheers! 🙂

Ravish Rajput
5 years ago

Hey Ravi,
It’s been nice and awesome tutorials. Its so helping. Great work, Thanks.

test's
test's
5 years ago

Hi nice’s Look up .
hii
” Every thing’s it’s a new functionality “. Looking nice12#.

karampal
karampal
5 years ago

can any one tell me how use this swipe down refresh with parse.com

Anurag Ajwani
5 years ago

Minor detail, on point 6, while creating the list_row.xml, you have used android:orientation=”horizontal” attribute on a RelativeLayout. The attribute is only available to LinearLayout and its subclasses

preyas
preyas
5 years ago

post

mostafa
mostafa
5 years ago

thank you bacause of your tutorials
please show us how can we extend layouts like search view on google play store or whats app atachment layout

Archana C R
Archana C R
5 years ago

It’s been nice and awesome tutorials. Its so helping. Great work, Thanks

Manny264
Manny264
5 years ago

When it initially loads and you pull up again it just keep on refreshing but no action. It wont even cancel and LogCat wont pick it up. How can that be fixed?

sreeshty raychoudhury
sreeshty raychoudhury
5 years ago

nice ….can you do demo for basic game tutorial for android

Kira Browdy
Kira Browdy
5 years ago

Hi Ravi,
I would like to advertise on your website but can’t find your email.
Please contact me for details!
THanks

Sarthak Majithia
Sarthak Majithia
5 years ago

I am implementing this for a list inside a fragment view. When I scroll down and then scroll up again, it starts to refresh, how to refresh only when the user has reached back to top item in the list?

Trey Rosius
Trey Rosius
5 years ago

@sarthakmajithia:disqus

Here is a fix from a thread on stack overflow for Recyclerview.Understand it and implement the idea on listView
http://stackoverflow.com/questions/25178329/recyclerview-and-swiperefreshlayout

Hope that helps

simple gats
simple gats
5 years ago

ravi.. why you don’t use recyclerview to replace listview…

vgnc
vgnc
5 years ago

If your list is duplicating when you refresh clear the movieList before you refresh:

@Override
public void onRefresh() {
movieList = new ArrayList();
fetchMovies();
}

MOOC SHARE
MOOC SHARE
4 years ago
Reply to  vgnc

Thank you so much. It works.

MOOC SHARE
MOOC SHARE
4 years ago
Reply to  vgnc

Hello Man, If I use the above, I didn’t get any update. To update I have to reopen the class. Do you why it was that?

Julian
Julian
4 years ago
Reply to  vgnc

it does’nt work for me?

Anna Katzen
Anna Katzen
5 years ago

Is it free for commercial use?

Pronab
Pronab
5 years ago

java.lang.NullPointerException
at swipe.com.down.activity.MainActivity.fetchMovies(MainActivity.java:149)
fetchMovies(); error Please Help.

Madhur Vaish
Madhur Vaish
5 years ago

The Code Is Good,but the application crashes abnormally!!

Can you provide me with some solution to this problem.

These are the list of errors generated in Logcat
07-22 17:47:52.662 22040-22040/? E/AndroidRuntime﹕ FATAL EXCEPTION: main

Process: example.com.refresh, PID: 22040

java.lang.NullPointerException: Attempt to invoke virtual method ‘void app.MyApplication.addToRequestQueue(com.android.volley.Request)’ on a null object reference

at example.com.refresh.MainActivity.fetchMovies(MainActivity.java:127)

at example.com.refresh.MainActivity.access$100(MainActivity.java:26)

at example.com.refresh.MainActivity$1.run(MainActivity.java:59)

at android.os.Handler.handleCallback(Handler.java:739)

at android.os.Handler.dispatchMessage(Handler.java:95)

at android.os.Looper.loop(Looper.java:145)

at android.app.ActivityThread.main(ActivityThread.java:5832)

at java.lang.reflect.Method.invoke(Native Method)

at java.lang.reflect.Method.invoke(Method.java:372)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1388)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)

Priyanka Gupta
Priyanka Gupta
4 years ago
Reply to  Madhur Vaish

U have not added a line in android menifest.
under application tag like…
android:name=”MyApplication”

endro
5 years ago

Madhur Vaish, can u try debug.

Rakhi Dhavale
5 years ago

Hi, I implemented the same example as in this post, but instead of Listiview, I used a recyclerView wrapped within a SwipeRefreshLayout element, !! Thanks !!

ARASHI Funsho
ARASHI Funsho
4 years ago
Reply to  Rakhi Dhavale

I did the same too, but implemented within a fragments in TabLayout 😉

shubham
shubham
5 years ago

Can you show us how we can implement this using Parse?

Ravi Tamada
5 years ago
Reply to  shubham

I am not sure about it. But it should be same as this. You need to parse the json provided by parse.com and do the same.

shubham
shubham
5 years ago
Reply to  Ravi Tamada

Thanks for replying, I’ll try that, what if I just fetch the whole list again when the user swipes down?

dsa
dsa
5 years ago

sdfdsfdsfds

hamed Ghadirian
hamed Ghadirian
5 years ago

tanX

Fəqan Çələbizadə
Fəqan Çələbizadə
5 years ago

Hi Ravi. How to do it as gmail style?

Mahdi Pishguy
5 years ago

Thanks. how to cache by volley when we dont have internet connection?

David Rivas
David Rivas
5 years ago

God Bless you men!!.

immi
immi
5 years ago

hai! i m new to android and having the follwoing problem.
what will be the sample function to retrieve data from database using volley library .for example if i have a table having three columns id,first_name,last_name .how will be the android function for retrieve operation. please help

MOOC SHARE
MOOC SHARE
4 years ago
Reply to  immi

StringRequest strReq = new StringRequest(Request.Method.POST,
url, new Response.Listener() {

@Override
public void onResponse(String response) {
Log.d(TAG, response.toString());

try {
JSONObject responseObj = new JSONObject(response);
boolean error = responseObj.getBoolean(“error”);
String message = responseObj.getString(“message”);
System.out.println(“Message: ” + message);

if(!error){

JSONArray profileObj = responseObj.getJSONArray(“info_submit_call”);
int len = profileObj.length();
Global.status = new String[len];

if (profileObj != null){
for (int i = 0; i < profileObj.length(); i++) {
JSONObject movieObj = profileObj.getJSONObject(i);
String rank = movieObj.getString("phoneTransfer");
String title = movieObj.getString("phoneReceiver");
String status_string = movieObj.getString("status");

Timothy Trisnadhama
Timothy Trisnadhama
5 years ago

Hey Ravi,

Great tutorial. I do have a question though, since your list display it descending order, how do you do it for ascending order?

Thanks a lot!

Timothy Trisnadhama
Timothy Trisnadhama
5 years ago

nvm… i got it… thanks….

MOOC SHARE
MOOC SHARE
4 years ago

How do you do that? I got this problems too.

MOOC SHARE
MOOC SHARE
4 years ago
Reply to  MOOC SHARE

I go it now. Just change movieList.add(0, m); to movieList.add(m);

187
0
Would love your thoughts, please comment.x
()
x