title: AsynTask with Endless Listview Scroll in android
body: <p>I am creating an application where in i need to have endless scrolling listview. I dnt want to use any library in my application. I have seen some examples on line that help in achieving such listview,but my doubt is how can i have an endless listview when my data are coming from server and are getting parsed in the Asynctask. How can i load 10 items at a time from my asynctask on scroll? I want to know to implement a endless listview on asyntask. 
  Do i call my asynctask in the onScroll() or not???</p>
  
  <pre><code>public class EndlessScrollExample extends ListActivity  {
      public JSONArray jsonarray,jsondatearray;
  
      public String url;
      public String selectedvalue;
      public String TAG = "TAG Event Display";
      public String SuggestCity;
      public String SuggestState;
      public String suggestCountry;
      public String event_id,address;
  
  
      String lat;
  
      String lng;
  
      public String event_name;
      public String dateKey;
      public String datetime,timenew;
      Calendar cal;
  
      public SharedPreferences prefs;
      public Editor editor;
      public String access_token,id,username;
      public static ArrayList&lt;EventsBean&gt; arrayEventsBeans = new ArrayList&lt;EventsBean&gt;();
      ArrayList&lt;DateBean&gt; sortArray = new ArrayList&lt;DateBean&gt;();
      public SAmpleAdapter adapter;
      public ImageView img_menu,img_calender;
      public ListView listview;
      public  EventsBean eventsbean;
     int counter = 0;
     int currentPage = 0;
  
     FetchEventValues fetchValues;
  
  
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          // TODO Auto-generated method stub
          super.onCreate(savedInstanceState);
          setTheme(android.R.style.Theme);
          setContentView(R.layout.sample_endless);
  
          listview = (ListView)findViewById(android.R.id.list);   
  
  
      try {
          // Preferences values fetched from the preference of FBConnection class.
          prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
          access_token = prefs.getString("access_token", null);
          id = prefs.getString("uid", null);
          username = prefs.getString("username", null);
  
  
  
          if(access_token == null &amp;&amp; id == null &amp;&amp; username == null)
          {
              Toast.makeText(getApplicationContext(), "FaceBook Login was not successful" +
                      "/nPlease Relogin.", Toast.LENGTH_SHORT).show();
          }
          else
          {
              Log.i(TAG, "VALUES::" + access_token+ "  " + id + "  " +username);
              url = "my Url";
          }
  
      } catch (NullPointerException e) {
  
          Log.i(TAG, "User Not Logged IN " + e.getMessage());
              // TODO Auto-generated catch block
              e.printStackTrace();
      }
  
  
  
  
          fetchValues = new FetchEventValues();
          fetchValues.execute();
          listview = getListView();
          listview.setOnScrollListener(new EndlessScrollListener());
  
  
  
      }
  
  // AsyncTask Class called in the OnCreate() when the activity is first started.
  
  
      public class FetchEventValues extends AsyncTask&lt;Integer, Integer, Integer&gt;
      {
          ProgressDialog progressdialog = new  ProgressDialog(EndlessScrollExample.this);
  
  
      @SuppressLint("SimpleDateFormat")
      @SuppressWarnings("unchecked")
      @Override
      protected Integer doInBackground(Integer... params) {
  
          currentPage++;
  
  
           // Creating JSON Parser instance
          JsonParser jParser = new JsonParser();
  
         // getting JSON string from URL
  
  
          //arrayEventsBeans.clear();
  
          JSONObject jsonobj = jParser.getJSONFromUrl(url);
  
          Log.i(TAG, "URL VALUES:" + url);
  
          try{
               // Code to get the auto complete values  Autocomplete Values
  
              JSONArray jsonAarray = jsonobj.getJSONArray(Constants.LOCATIONS);
  
              eventsbean = new EventsBean();
  
              Log.e(TAG, "Location Array Size:" + jsonAarray.length());   
  
              for(int j = 0 ; j &lt; jsonAarray.length() ; j++)
               {
                  if(!jsonAarray.getJSONObject(j).isNull(Constants.LOCATION_CITY) &amp;&amp; !jsonAarray.getJSONObject(j).isNull(Constants.LOCATION_STATE) &amp;&amp; !jsonAarray.getJSONObject(j).isNull(Constants.LOCATION_COUNTRY))
                  {
                      JSONObject job = jsonAarray.getJSONObject(j);
  
                      if(job.has(Constants.LOCATION_STATE))
                      {
                          SuggestCity = job.getString(Constants.LOCATION_CITY);
                          eventsbean.setLocation_city(job.getString(Constants.LOCATION_CITY));
                          SuggestState = job.getString(Constants.LOCATION_STATE);
                          eventsbean.setLocation_state(job.getString(Constants.LOCATION_STATE));
                          suggestCountry = job.getString(Constants.LOCATION_COUNTRY);
                          eventsbean.setLocation_country(job.getString(Constants.LOCATION_COUNTRY));
                      }       
  
  
                  } 
  
  
               }
  
  
                     // JSON object to fetch the events in datewise format
                     JSONObject eventobject = jsonobj.getJSONObject("events");
  
                     arrayEventsBeans = new ArrayList&lt;EventsBean&gt;();
  
  
                     // @SuppressWarnings("unchecked")
                      Iterator&lt;Object&gt; keys = eventobject.keys();
  
                      while (keys.hasNext()) {
  
                        String datestring = String.valueOf(keys.next());
  
                        if (datestring.trim().length() &gt; 0) {
                            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
                            Date date = formatter.parse(datestring);
  
                            DateBean dateBean = new DateBean(date);
                            sortArray.add(dateBean);
                           } 
  
                       // JSONArray jsonArray = eventobject.getJSONArray(datestring);
                        //System.out.println(" --"+jsonArray);
                      }
  
                      System.out.println("size:"+sortArray.size());
  
                      System.out.println("==========sorting array======");
                      Collections.sort(sortArray,new CompareDate());
                      //reverse order
                      //Collections.reverse(sortArray);
  
                      for(DateBean d : sortArray){
                       dateKey = new SimpleDateFormat("yyyy-MM-dd").format(d.getDate());
                       System.out.println(dateKey);
  
                       Date today = new Date();
                       Date alldates = d.getDate();
  
  
  
                    ///  Calendar alldates1 = Calendar.getInstance();
  
                       JSONArray jsonArray = eventobject.getJSONArray(dateKey);
                       System.out.println(" --"+jsonArray);
  
  
                       for (int i = 0 ; i &lt; jsonArray.length() ; i++)
                       {
  
                           if ((today.compareTo(alldates) &lt; 0  || (today.compareTo(alldates)== 0)))
                              // if (alldates1  &gt; cal) alldates.getTime() &gt;= today.getTime()
                           {
  
                               String currentTimeStr = "7:04 PM";
  
                                  Date userDate = new Date();
                                  String userDateWithoutTime = new SimpleDateFormat("yyyyMMdd").format(userDate);
  
                                  String currentDateStr = userDateWithoutTime + " " + currentTimeStr;
                                  Date currentDate = new SimpleDateFormat("yyyyMMdd h:mm a").parse(currentDateStr);
  
                                  if (userDate.compareTo(currentDate) &gt;= 0) {
                                      System.out.println(userDate + " is greater than or equal to " + currentDate);
                                  } else {
                                      System.out.println(userDate + " is less than " + currentDate);
                                  }
  
  
                           JSONObject jsonobjname = jsonArray.getJSONObject(i);
  
                          EventsBean eventsbean = new EventsBean();
  
                           JSONObject jobjectpicture = jsonobjname.getJSONObject(Constants.PICTURE);
                           JSONObject jobjeventpicture = jobjectpicture.getJSONObject(Constants.DATA);
                           eventsbean.setUrl(jobjeventpicture.getString(Constants.URL));
  
                           if(jsonobjname.has(Constants.OWNER))
                           {
                           JSONObject owner_obj = jsonobjname.getJSONObject(Constants.OWNER);
                           eventsbean.setOwner_id(owner_obj.getString(Constants.OWNER_ID));
                           eventsbean.setOwner_name(owner_obj.getString(Constants.OWNER_NAME));
                           String owner_name = owner_obj.getString(Constants.OWNER_NAME);
                           Log.i(TAG, "Owner:" + owner_name);
                           }
  
                          if(!jsonobjname.isNull(Constants.COVER))
                          {
                           JSONObject objectcover = jsonobjname.getJSONObject(Constants.COVER);
                           eventsbean.setCover_id(objectcover.getString(Constants.COVER_ID));
                           eventsbean.setSource(objectcover.getString(Constants.SOURCE));
                           String cover_url = objectcover.getString(Constants.SOURCE);
                           Log.i(TAG, "Cover Url:" + cover_url);
                           eventsbean.setOffset_y(objectcover.getString(Constants.OFFSET_Y));
                           eventsbean.setOffset_x(objectcover.getString(Constants.OFFSET_X));
                          }
  
  
                           eventsbean.setName(jsonobjname.getString(Constants.NAME));
                           eventsbean.setEvent_id(jsonobjname.getString(Constants.EVENT_ID));
                           eventsbean.setStart_time(jsonobjname.getString(Constants.START_TIME));
                           eventsbean.setDescription(jsonobjname.getString(Constants.DESCRIPTION));
                           eventsbean.setLocation(jsonobjname.getString(Constants.LOCATION));
  
                           if(!jsonobjname.isNull(Constants.IS_SILHOUETTE))
                           {
                              eventsbean.setIs_silhouette(jsonobjname.getString(Constants.IS_SILHOUETTE)); 
                           }
  
                           eventsbean.setPrivacy(jsonobjname.getString(Constants.PRIVACY));
                           datetime = jsonobjname.getString(Constants.START_TIME);
  
  
                           if(!jsonobjname.isNull(Constants.VENUE))
                           {
  
                           JSONObject objectvenue = jsonobjname.getJSONObject(Constants.VENUE);
  
                           if(objectvenue.has(Constants.VENUE_NAME))
                           {
                               eventsbean.setVenue_name(objectvenue.getString(Constants.VENUE_NAME));
                               event_name = objectvenue.getString(Constants.VENUE_NAME); 
                               Log.i(TAG, "Event Venue Name:" + event_name);
                           }
                           else
                           {   
  
                           eventsbean.setLatitude(objectvenue.getString(Constants.LATITUDE));
                           eventsbean.setLongitude(objectvenue.getString(Constants.LONGITUDE));
                           eventsbean.setCity(objectvenue.getString(Constants.CITY));
                           eventsbean.setState(objectvenue.getString(Constants.STATE));
                           eventsbean.setCountry(objectvenue.getString(Constants.COUNTRY));
                           eventsbean.setVenue_id(objectvenue.getString(Constants.VENUE_ID));
                           eventsbean.setStreet(objectvenue.getString(Constants.STREET));
                           address = objectvenue.getString(Constants.STREET);
                           eventsbean.setZip(objectvenue.getString(Constants.ZIP));
  
                  }
              }
                           arrayEventsBeans.add(eventsbean);
  
                           Log.i(TAG, "arry list values:" + arrayEventsBeans.size());
  
  
                          }
                      }
                   }
  
                 }catch(Exception e){
  
                     Log.e(TAG , "Exception Occured:" + e.getMessage());
                 }
  
  
              return null;
          }
  
  
          class CompareDate implements Comparator&lt;DateBean&gt;{
  
             @Override
             public int compare(DateBean d1, DateBean d2) {
  
              return d1.getDate().compareTo(d2.getDate());
             }   
      }
  
  
          @Override
          protected void onProgressUpdate(Integer... values) {
          // TODO Auto-generated method stub
          super.onProgressUpdate(values);
          }
  
  
          @Override
          protected void onPostExecute(Integer result) 
          {
              // TODO Auto-generated method stub
              super.onPostExecute(result);
  
                  if(this.progressdialog.isShowing()) 
                  {
                      this.progressdialog.dismiss();
  
                  }
  
  
                  if(adapter == null)
                  {
                      adapter = new SAmpleAdapter(EndlessScrollExample.this, 0, arrayEventsBeans);
                      listview.setAdapter(adapter);
                  }
                  else
                  {
                      adapter.notifyDataSetChanged();
                  }
  
                      //currentPage++;
  
  
  
  
          }
  
  
          @Override
          protected void onPreExecute() {
  
              super.onPreExecute();
  
              this.progressdialog.setMessage("Loading....");
              this.progressdialog.setCanceledOnTouchOutside(false);
              this.progressdialog.show();
          }
  
  
          public int setPage(int currentPage) {
              return currentPage;
              // TODO Auto-generated method stub
  
  
  
          }       
      }
  
  
      public class EndlessScrollListener implements OnScrollListener {
  
          private int visibleThreshold = 0;
          private int currentPage = 0;
  
  
          public EndlessScrollListener() {
          }
          public EndlessScrollListener(int visibleThreshold) {
              this.visibleThreshold = visibleThreshold;
          }
  
          @Override
          public void onScroll(AbsListView view, int firstVisibleItem,
                  int visibleItemCount, int totalItemCount) {
  
          }
  
          @Override
          public void onScrollStateChanged(AbsListView view, int scrollState) {
  
              if (scrollState == SCROLL_STATE_IDLE) {
                  if (listview.getLastVisiblePosition() &gt;= listview.getCount() - visibleThreshold) {
                      currentPage++;
                      fetchValues.setPage(currentPage);
                      fetchValues.execute();
                  }
              }
  
          }
      }
  
  
  
      }
  </code></pre>
  
  <p>Thanks in advance. </p>