title: Pull to refresh GridView infinite loading/ fails to pull data
body: <p>I can't seem to figure out what is going wrong with this, the code is pretty clean/ simple, but for some reason when I pull to refresh, it just shows me the loading icon infinity. Not only that, but I don't even receive any errors. The library I used for pull to refresh is <a href="https://github.com/chrisbanes/Android-PullToRefresh" rel="nofollow">this one</a>.</p>
  
  <p>I've spent several hours trying to figure this out, but the fact that it's not even giving me errors is making it very hard for me to track down.</p>
  
  <p>And yes, I am sure the rest request is working.</p>
  
  <pre><code>import java.util.ArrayList;
  import java.util.HashMap;
  
  import org.json.JSONArray;
  import org.json.JSONException;
  import org.json.JSONObject;
  
  import android.app.Activity;
  import android.os.Bundle;
  import android.util.Log;
  import android.view.Gravity;
  import android.view.Menu;
  import android.view.MenuItem;
  import android.widget.GridView;
  import android.widget.TextView;
  import android.widget.Toast;
  
  import com.handmark.pulltorefresh.library.PullToRefreshBase;
  import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
  import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener2;
  import com.handmark.pulltorefresh.library.PullToRefreshGridView;
  import com.loopj.android.http.JsonHttpResponseHandler;
  import com.loopj.android.http.RequestParams;
  
  public final class PullToRefresh extends Activity {
  
      static final int MENU_SET_MODE = 0;
      static final String KEY_FEED = "feed"; // parent node
      static final String KEY_UID_FK = "uid_fk";
      static final String KEY_FIRST_NAME = "first_name";
      static final String KEY_LAST_NAME = "last_name";
      public static final String KEY_NAME = "name";
      static final String KEY_MESSAGE = "message";
      static final String KEY_CREATED = "created";
      static final String KEY_THUMB_URL = "thumb_img";
      static final String KEY_DATA = "data";
      static final String KEY_HOMETOWN = "hometown";
      static final String KEY_BIO = "bio";
  
      private ArrayList&lt;HashMap&lt;String, String&gt;&gt; feedList = new ArrayList&lt;HashMap&lt;String, String&gt;&gt;();
      private PullToRefreshGridView mPullRefreshGridView;
      private GridView mGridView;
      private GridAdapter adapter;
  
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_ptr_grid);
  
          mPullRefreshGridView = (PullToRefreshGridView) findViewById(R.id.pull_refresh_grid);
          mGridView = mPullRefreshGridView.getRefreshableView();
  
          // Set a listener to be invoked when the list should be refreshed.
          mPullRefreshGridView
                  .setOnRefreshListener(new OnRefreshListener2&lt;GridView&gt;() {
  
                      @Override
                      public void onPullDownToRefresh(
                              PullToRefreshBase&lt;GridView&gt; refreshView) {
                          Toast.makeText(PullToRefresh.this, "Pull Down!",
                                  Toast.LENGTH_SHORT).show();
                          try {
                              new RestClientUsage().getPublicTimeline();
                          } catch (JSONException e) {
                              // TODO Auto-generated catch block
                              e.printStackTrace();
                          }
                      }
  
                      @Override
                      public void onPullUpToRefresh(
                              PullToRefreshBase&lt;GridView&gt; refreshView) {
                          Toast.makeText(PullToRefresh.this, "Pull Up!",
                                  Toast.LENGTH_SHORT).show();
                          try {
                              new RestClientUsage().getPublicTimeline();
                          } catch (JSONException e) {
                              // TODO Auto-generated catch block
                              e.printStackTrace();
                          }
                      }
                  });
  
          ArrayList&lt;HashMap&lt;String, String&gt;&gt; feedList = new ArrayList&lt;HashMap&lt;String, String&gt;&gt;();
          TextView tv = new TextView(this);
          tv.setGravity(Gravity.CENTER);
          tv.setText("Empty View, Pull Down/Up to Add Items");
          mPullRefreshGridView.setEmptyView(tv);
          adapter = new GridAdapter(PullToRefresh.this, feedList);
          mGridView.setAdapter(adapter);
      }
  
      class RestClientUsage {
  
          public void getPublicTimeline() throws JSONException {
              RequestParams params = new RequestParams();
              params.put("loggedin_uid", TabHostFragmentActivity.loggedin_uid);
  
              RestClient.post("http://localhost/basic/rest/request/format/json",
                      params, new JsonHttpResponseHandler() {
  
                          private JSONArray feed;
  
                          @Override
                          public void onSuccess(JSONObject json) {
                              try {
                                  Log.i("JSON-&gt;TRAILS RESPONSE", json.toString(3));
  
                                  // Getting Feed Array
                                  feed = json.getJSONArray(KEY_FEED);
  
                                  /*
                                  * Log &amp; Debug Code String feed_log =
                                  * feed.toString(3); int feed_length =
                                  * feed.length(); String string_length =
                                  * Integer.toString(feed_length);
                                  * Log.i("JSON PROFILE FEED RESPONSE", feed_log
                                  * ); Log.i("JSON PROFILE FEED LENGTH",
                                  * string_length);
                                  */
  
                                  // looping through Feed of Updates
                                  for (int i = 0; i &lt; feed.length(); i++) {
                                      JSONObject c = feed.getJSONObject(i);
  
                                      String jFeedObj = c.toString(3);
                                      Log.i("JSON FEED OBJ", jFeedObj);
  
                                      // Storing each json item in variable
                                      String uid = c.getString(KEY_UID_FK);
                                      String first_name = c
                                              .getString(KEY_FIRST_NAME);
                                      String last_name = c
                                              .getString(KEY_LAST_NAME);
                                      String name = first_name + ' ' + last_name;
                                      String http = "http://10.0.2.2/CI_REST_LOGIN/UPLOADS/thumbs/";
                                      String base_url = c
                                              .getString(KEY_THUMB_URL);
                                      String thumb_url = http + base_url;
                                      String message = c.getString(KEY_MESSAGE);
                                      String created = c.getString(KEY_CREATED);
  
                                      // creating new HashMap
                                      HashMap&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();
  
                                      // adding each child node to HashMap key =&gt;
                                      // value
                                      map.put(KEY_UID_FK, uid);
                                      map.put(KEY_NAME, name);
                                      map.put(KEY_MESSAGE, message);
                                      map.put(KEY_CREATED, created);
                                      map.put(KEY_THUMB_URL, thumb_url);
  
                                      Log.i("Trails - line 130", "Success");
                                      // adding HashList to ArrayList
                                      feedList.add(map);
                                  }
  
                                  adapter.notifyDataSetChanged();
                                  // Call onRefreshComplete when the list has been
                                  // refreshed.
                                  mPullRefreshGridView.onRefreshComplete();
  
                              } catch (JSONException e) {
                                  // TODO Auto-generated catch block
                                  e.printStackTrace();
                              }
                          }
                      });
          }
      }
  
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          menu.add(
                  0,
                  MENU_SET_MODE,
                  0,
                  mPullRefreshGridView.getMode() == Mode.BOTH ? "Change to MODE_PULL_DOWN"
                          : "Change to MODE_PULL_BOTH");
          return super.onCreateOptionsMenu(menu);
      }
  
      @Override
      public boolean onPrepareOptionsMenu(Menu menu) {
          MenuItem setModeItem = menu.findItem(MENU_SET_MODE);
          setModeItem
                  .setTitle(mPullRefreshGridView.getMode() == Mode.BOTH ? "Change to MODE_PULL_FROM_START"
                          : "Change to MODE_PULL_BOTH");
  
          return super.onPrepareOptionsMenu(menu);
      }
  
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()) {
          case MENU_SET_MODE:
              mPullRefreshGridView
                      .setMode(mPullRefreshGridView.getMode() == Mode.BOTH ? Mode.PULL_FROM_START
                              : Mode.BOTH);
              break;
          }
  
          return super.onOptionsItemSelected(item);
      }
  }
  </code></pre>
  
  <p>And here is the code for my <code>GridView</code> adapter:</p>
  
  <pre><code>import java.util.ArrayList;
  import java.util.HashMap;
  
  import android.app.Activity;
  import android.content.Context;
  import android.content.Intent;
  import android.util.Log;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.view.ViewGroup;
  import android.widget.BaseAdapter;
  import android.widget.ImageView;
  import android.widget.TextView;
  
  import com.loopj.android.image.SmartImageView;
  
  public class GridAdapter extends BaseAdapter {
  
      private Activity activity;
      private ArrayList&lt;HashMap&lt;String, String&gt;&gt; data;
      private static LayoutInflater inflater = null;
      public ImageLoader imageLoader;
  
      public GridAdapter(Activity a, ArrayList&lt;HashMap&lt;String, String&gt;&gt; d) {
          activity = a;
          data = d;
          inflater = (LayoutInflater) activity
                  .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          imageLoader = new ImageLoader(activity.getApplicationContext());
      }
  
      public int getCount() {
          return data.size();
      }
  
      public Object getItem(int position) {
          return position;
      }
  
      public long getItemId(int position) {
          return position;
      }
  
      public View getView(int position, View convertView, ViewGroup parent) {
          View vi = convertView;
          if (convertView == null)
              vi = inflater.inflate(R.layout.mobile, null);
  
          TextView name = (TextView) vi.findViewById(R.id.grid_item_label); // title
          SmartImageView thumb_image = (SmartImageView) vi
                  .findViewById(R.id.grid_item_image);
  
          HashMap&lt;String, String&gt; update = new HashMap&lt;String, String&gt;();
          update = data.get(position);
  
          // Setting all values in listview
          name.setText(update.get("name"));
          thumb_image.setImageUrl(update.get("thumb_img"));
          name.setOnClickListener(new myOnClickListener(position));
          thumb_image.setOnClickListener(new myOnClickListener(position));
          return vi;
      }
  
      public class myOnClickListener implements OnClickListener {
  
          private int position;
          private String clicked_uid;
  
          public myOnClickListener(int position) {
              this.position = position;
          }
  
          @Override
          public void onClick(View v) { // TODO Auto-generated method stub
              HashMap&lt;String, String&gt; update = new HashMap&lt;String, String&gt;();
              update = data.get(position);
              Log.i("Update Position:", update.toString());
              clicked_uid = update.get("uid");
              Log.d("Clicked UID:", clicked_uid + "");
              Intent i = new Intent(activity.getApplicationContext(),
                      TabHostFragmentActivity.class);
              i.putExtra("profile_uid", clicked_uid);
              activity.startActivity(i);
          }
      }
  }
  </code></pre>