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.
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.
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); ?>
Hi there! I am Founder at androidhive and programming enthusiast. My skills includes Android, iOS, PHP, Ruby on Rails and lot more. If you have any idea that you would want me to develop? Let’s talk: ravi@androidhive.info
nice
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”} ] .
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
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.
Ravi, Doing a Great Job 🙂
nice work
hmmmm
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?
Прекрасно! Спасибо за Ваши уроки, как всегда все отлично работает.
Добро пожаловать 🙂
New Fans here.. Always Awesome Tutorial Article.. Keep Up The Good Work…
Thanks Andra Galih 🙂
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
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!
I realize u have a valid point here but Thank u for considering my suggestion !!
Simple and straight forward…Thanks Ravi. I’de already implemented this in an app, but i still dig your implementation…Great Work
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 @_@ ;
Thanks Ahmad for your tip 🙂
hi how can we change the code ?
Just an extra tip, you can customize the SwipeRefreshLayout’s animated loader
swipeRefreshLayout.setColorSchemeResources(R.color.blue,R.color.red);
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 !
Very clear and simply explained. Thanks..
Thank you for the Tutorial . Can you Please Provide a Tutorial about ShowCaseView library With a Sample .
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
Ravi, Doing a Great Job 🙂
Thank You 🙂
Hi Ravi, You are doing a great job. Very informative.
Would you be available to work on a side project? Thanks!
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
Ravi, i’ve a request. Could please make some tutorial about creating `Custom Views` in Android.
ok keep updatng.
Please Add Live Wallpaper tutorial,Using .gif file Or on Particular Time Wallpaper Autometically change Wallpaper
ok
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! 🙂
Hey Ravi,
It’s been nice and awesome tutorials. Its so helping. Great work, Thanks.
Hi nice’s Look up .
hii
” Every thing’s it’s a new functionality “. Looking nice12#.
can any one tell me how use this swipe down refresh with parse.com
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
post
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
It’s been nice and awesome tutorials. Its so helping. Great work, Thanks
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?
nice ….can you do demo for basic game tutorial for android
Hi Ravi,
I would like to advertise on your website but can’t find your email.
Please contact me for details!
THanks
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?
@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
ravi.. why you don’t use recyclerview to replace listview…
If your list is duplicating when you refresh clear the movieList before you refresh:
@Override
public void onRefresh() {
movieList = new ArrayList();
fetchMovies();
}
Thank you so much. It works.
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?
it does’nt work for me?
Is it free for commercial use?
java.lang.NullPointerException
at swipe.com.down.activity.MainActivity.fetchMovies(MainActivity.java:149)
fetchMovies(); error Please Help.
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)
U have not added a line in android menifest.
under application tag like…
android:name=”MyApplication”
Madhur Vaish, can u try debug.
Hi, I implemented the same example as in this post, but instead of Listiview, I used a recyclerView wrapped within a SwipeRefreshLayout element, !! Thanks !!
I did the same too, but implemented within a fragments in TabLayout 😉
Can you show us how we can implement this using Parse?
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.
Thanks for replying, I’ll try that, what if I just fetch the whole list again when the user swipes down?
sdfdsfdsfds
tanX
Hi Ravi. How to do it as gmail style?
Thanks. how to cache by volley when we dont have internet connection?
God Bless you men!!.
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
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");
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!
nvm… i got it… thanks….
How do you do that? I got this problems too.
I go it now. Just change movieList.add(0, m); to movieList.add(m);