ListView onScroll добавить еще товары

    private class getArticles extends AsyncTask<Void, Void, Void> {

    String url;

    getArticles(String paramUrl) {
        this.url = paramUrl;
    }


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        mProgressDialog = new ProgressDialog(App.this);
        mProgressDialog.setMessage("Učitavanje artikala...");
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.setCancelable(false);
        mProgressDialog.show();
    }

    @Override
    protected Void doInBackground(Void... params) {

        arraylist = new ArrayList<>();

        try {

            Document document = Jsoup.connect(url).get();
            Elements els = document.select("ul.category3 > li");

            for (Element el : els) {

                HashMap<String, String> map = new HashMap<>();

                Elements slika = el.select("div.category3-image > a > img");
                Elements naslov = el.select("div.category3-text > a.main-headline");
                Element datum_noformat = el.select("div.category3-text > div.headlines-info > ul.headlines-info > li").first();
                Element datum = datum_noformat.html(datum_noformat.html().replaceAll("Posted ", ""));
                Elements desc = el.select("div.category3-text > p");
                Elements link = el.select("div.category3-text > a.main-headline");
                Element br_kom = el.select("div.category3-text > div.headlines-info > ul.headlines-info > li.comments-icon").first();

                map.put("naslov", naslov.text());
                map.put("datum", datum.text());
                map.put("desc", desc.text());
                map.put("ikona", slika.attr("src"));
                map.put("link", link.attr("abs:href"));
                map.put("brkom", br_kom.text());
                arraylist.add(map);


            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        listview = (ListView) findViewById(R.id.listview);
        adapter = new ArtikliAdapter(App.this, arraylist);
        listview.setAdapter(adapter);
        mProgressDialog.dismiss();
    }

Я искал много кодов для прокрутки onlistview, но не знал, как его реализовать. Проблема в том, что когда я вызываю свою асинтезу, у меня есть url param, как new getArticles("http://example.com").execute();

Я хочу реализовать onscrolllistener, но он выглядит следующим образом: мой параметр обычно имеет значение: http://www.example.com/category/categoryname/, поэтому вторая страница выглядит как http://www.example.com/category/categoryname/page/2/, третья - http://www.example.com/category/categoryname/page/3/ и т.д. На каждой странице есть 7 элементов, которые необходимо разобрать.

Как я мог реализовать onscrolllistener из-за параметра url?

Спасибо заранее.

Ответ 1

Основы на этой ссылке, я написал следующее решение для добавления элементов (30 элементов за раз, т.е. размер страницы = 30) в listview асинхронно.

Создайте класс с именем EndlessListView следующим образом:

public class EndlessListView extends ListView implements OnScrollListener {

private View footer;
private boolean isLoading;
private EndlessListener listener;// listner
private EndlessAdapter endlessAdapter;// adapter.

private int maxNoOfElement;

public EndlessListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    this.setOnScrollListener(this);
}

public EndlessListView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.setOnScrollListener(this);
}

public EndlessListView(Context context) {
    super(context);
    this.setOnScrollListener(this);
}

public void setListener(EndlessListener listener) {
    this.listener = listener;
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {

    if (getAdapter() == null)
        return;

    if (getAdapter().getCount() == 0 || getAdapter().getCount() <= 5)
        return;

    int l = visibleItemCount + firstVisibleItem;
    if (l >= totalItemCount && !isLoading) {
        // It is time to add new data. We call the listener
        Log.e("LOAD", "DATA");
        isLoading = true;
        listener.loadData();

    }
}

public void setMaxElemnt(int maxNoOfElement) {
    this.maxNoOfElement = maxNoOfElement;
}

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}

public void setLoadingView(int resId) {
    LayoutInflater inflater = (LayoutInflater) super.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    footer = (View) inflater.inflate(resId, null);
    this.addFooterView(footer);
}

public void setAdapter(EndlessAdapter adapter) {
    super.setAdapter(adapter);
    this.endlessAdapter = adapter;

}

public void addNewData(List<Integer> data) {
    endlessAdapter.setData(data);
    endlessAdapter.notifyDataSetChanged();
    isLoading = false;
}

public static interface EndlessListener {
    public void loadData();

}

 }

После этого мы должны создать для него адаптер, называемый

EndlessAdapter

public class EndlessAdapter extends BaseAdapter {
private List<Integer> mIntegers;
private Context context;

public EndlessAdapter(Context context) {
    this.context = context;
}

public void setData(List<Integer> mIntegers) {
    this.mIntegers = mIntegers;
}

@Override
public int getCount() {
    if (mIntegers == null)
        return 0;
    return mIntegers.size();
}

@Override
public Integer getItem(int index) {

    if (mIntegers == null) {
        return null;
    } else {
        return mIntegers.get(index);
    }
}

@Override
public long getItemId(int arg0) {
    // TODO Auto-generated method stub
    return 0;
}

class ViewHolder {
    TextView textView;
}

@Override
public View getView(int index, View view, ViewGroup viewGroup) {
    ViewHolder holder;
    if (view == null) {
        holder = new ViewHolder();
        view = ((LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE))
                .inflate(R.layout.rows, viewGroup, false);
        holder.textView = (TextView) view.findViewById(R.id.mtext);
        view.setTag(holder);

    } else {
        holder = (ViewHolder) view.getTag();
    }
    holder.textView.setText(getItem(index) + "");
    return view;
}

   }

Теперь в xml активности мы можем использовать EndlessListView (в пакете com.example.stackoverflow) следующим образом:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<com.example.stackoverflow.EndlessListView
    android:id="@+id/endlessListView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

</RelativeLayout>

После этого шага нам нужно сделать следующее изменение в MainActivity

    public class MainActivity extends Activity implements EndlessListener {
private EndlessAdapter adapter;
private EndlessListView endlessListView;
private List<Integer> data;
private int gStartIndex = 30;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    endlessListView = (EndlessListView) findViewById(R.id.endlessListView);
    adapter = new EndlessAdapter(this);
    data = new ArrayList<Integer>();

    endlessListView.setLoadingView(R.layout.footer);
    // endlessListView.showFooter();
    endlessListView.setListener(this);
    endlessListView.setAdapter(adapter);
    gStartIndex = 0;
    fillData(gStartIndex);
}

private void fillData(int startIndex) {

    new AsyncLoadData().execute(startIndex);

}

@Override
public void loadData() {

    fillData(gStartIndex);

}

private class AsyncLoadData extends AsyncTask<Integer, Integer, Void> {

    @Override
    protected Void doInBackground(Integer... params) {
        int gendIndex = params[0] + 30;
        gStartIndex = gendIndex;
        /***
         * Here you could add your n/w code. To simulate the n/w comm. i am
         * adding elements to list and making it sleep for few sec.
         * */
        for (int i = params[0]; i < gendIndex; i++) {
            publishProgress(i);

        }
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        data.add(values[0]);
    }

    @Override
    protected void onPostExecute(Void result) {
        endlessListView.addNewData(data);
    }
}

    }

Ответ 2

Этот пользовательский ScrollListView, который я только что нашел, имеет OnBottomReachedListener, который вы можете реализовать из своих Activity или Fragment и получать события, когда пользователь попадает в нижнюю часть страницы. Вам также нужно будет отслеживать текущую страницу и когда снизу попадет, чтобы загрузить следующую страницу. Последние данные должны быть добавлены в существующий ArrayList, и вы должны называть notifyDataSetChanged() на вашем адаптере, чтобы ListView мог визуализировать новые данные. Вам не нужно создавать новый адаптер, вам просто нужно обновить источник данных, который является вашим ArrayList.

Если вы поддерживаете изменение ориентации, вы должны сохранить onSaveInstanceState() текущий номер страницы, чтобы при восстановлении Activity или Fragment он мог продолжить работу с правильной страницы. И вам придется сохранить источник данных ArrayList безопасным для изменений конфигурации, потому что вы не хотите его повторно загружать. Я бы предложил использовать Fragment с setRetainInstance() для true для сохранения ArrayList.

Вот мой собственный код для хранения данных вокруг использования RetainFragment:

/**
 * A simple non-UI Fragment that stores a single Object
 * and is retained over configuration changes.
 */
public class RetainFragment<E extends Object> extends Fragment {

    /** Object for retaining. */
    private E mObject;

    /**
     * Empty constructor as per the Fragment documentation
     */
    public RetainFragment() {}

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Make sure this Fragment is retained over a configuration change
        setRetainInstance(true);
    }

    /**
     * Store a single object in this Fragment.
     *
     * @param object The object to store
     */
    public void setObject(E object) {
        mObject = object;
    }

    /**
     * Get the stored object.
     *
     * @return The stored object
     */
    public E getObject() {
        return mObject;
    }
}

Пример использования RetainFragment в вашем Activity:

FragmentManager fm = getFragmentManager();
mRetainFragment = (RetainFragment<ArrayList>) fm.findFragmentByTag(RETAIN_FRAG);
if (mRetainFragment == null) {
    mRetainFragment = new RetainFragment<>();
    mRetainFragment.setObject(new ArrayList());
    fm.beginTransaction().add(mRetainFragment, RETAIN_FRAG).commit();
}

ArrayList yourArrayList = mRetainFragment.getObject();
// Now your ArrayList is saved accrossed configuration changes

Ответ 3

вот что вы хотите кулаком добавить onscrolllistner в listview

      boolean loading_flage = false;

                                    yourlistview.setOnScrollListener(new OnScrollListener() {

                                        @Override
                                        public void onScrollStateChanged(
                                                AbsListView view,
                                                int scrollState) {
                                            // TODO Auto-generated method stub

                                        }

                                        @Override
                                        public void onScroll(AbsListView view,
                                                int firstVisibleItem,
                                                int visibleItemCount,
                                                int totalItemCount) {

                                            final int lastItem = firstVisibleItem
                                                    + visibleItemCount;

                                            if ((lastItem == totalItemCount)
                                                    & loading_flage == false) {

//this to prevent the list to make more than one request in time
                                                loading_flage = true;
    //you can put the index for your next page here
                                                loadMore(int page);

                                            }

                                        }
                                    });

а затем при загрузке больше после загрузки страницы установите загрузку с помощью false и проанализируйте данные, добавив их к данным, которые вы имеете

                      //notify the adapter
                     adapter.notifyDataSetChanged();
                      loading_flage = false;

Ответ 4

Вы можете достичь, добавив scrolllistener в listview и проверьте условие, если последний последний видимый элемент списка последний в ArrayList, затем вызовите асинтез с добавленным номером страницы и обновите listview, в то время как добавьте представление в listview и после получения результата из сервер удаляет загрузку большего вида из списка, например: AndroidListViewLoadMoreActivity.java

public class AndroidListViewLoadMoreActivity extends Activity {

 ArrayList<Country> countryList;
 MyCustomAdapter dataAdapter = null;
 int page = 0;
 boolean loadingMore = false;
 View loadMoreView;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  ListView listView = (ListView) findViewById(R.id.listView1);

  loadMoreView = ((LayoutInflater)this
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE))
    .inflate(R.layout.loadmore, null, false);
  listView.addFooterView(loadMoreView);

  //create an ArrayAdaptar from the String Array
  countryList = new ArrayList<Country>();
  dataAdapter = new MyCustomAdapter(this,
    R.layout.country_info, countryList);
  listView.setAdapter(dataAdapter);

  //enables filtering for the contents of the given ListView
  listView.setTextFilterEnabled(true);

  listView.setOnItemClickListener(new OnItemClickListener() {
   public void onItemClick(AdapterView<?> parent, View view,
     int position, long id) {
    // When clicked, show a toast with the TextView text
    Country country = (Country) parent.getItemAtPosition(position);
    Toast.makeText(getApplicationContext(),
      country.getCode(), Toast.LENGTH_SHORT).show();
   }
  });

  listView.setOnScrollListener(new OnScrollListener(){

   @Override
   public void onScrollStateChanged(AbsListView view, int scrollState) {}

   @Override
   public void onScroll(AbsListView view, int firstVisibleItem,
     int visibleItemCount, int totalItemCount) {

   int lastInScreen = firstVisibleItem + visibleItemCount;    
   if((lastInScreen == totalItemCount) && !(loadingMore)){     
    String url = "http://10.0.2.2:8080/CountryWebService" + 
     "/CountryServlet";
    grabURL(url); 
   }
   }
  });

  String url = "http://example.com";
  grabURL(url); 

 }

 public void grabURL(String url) {
  Log.v("Android Spinner JSON Data Activity", url);
  new GrabURL().execute(url);
 }

 private class GrabURL extends AsyncTask<String, Void, String> {
  private static final int REGISTRATION_TIMEOUT = 3 * 1000;
  private static final int WAIT_TIMEOUT = 30 * 1000;
  private final HttpClient httpclient = new DefaultHttpClient();
  final HttpParams params = httpclient.getParams();
  HttpResponse response;
  private String content =  null;
  private boolean error = false;
  private ProgressDialog dialog = 
   new ProgressDialog(AndroidListViewLoadMoreActivity.this);

  protected void onPreExecute() {
   dialog.setMessage("Getting your data... Please wait...");
   dialog.show();
  }

  protected String doInBackground(String... urls) {

   String URL = null;
   loadingMore = true;

   try {

   URL = urls[0];
   HttpConnectionParams.setConnectionTimeout(params, REGISTRATION_TIMEOUT);
   HttpConnectionParams.setSoTimeout(params, WAIT_TIMEOUT);
   ConnManagerParams.setTimeout(params, WAIT_TIMEOUT);

   HttpPost httpPost = new HttpPost(URL);

   //add name value pair for the country code
   List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
   nameValuePairs.add(new BasicNameValuePair("page",String.valueOf(page)));

   httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
   response = httpclient.execute(httpPost);

    StatusLine statusLine = response.getStatusLine();
    if(statusLine.getStatusCode() == HttpStatus.SC_OK){
     ByteArrayOutputStream out = new ByteArrayOutputStream();
     response.getEntity().writeTo(out);
     out.close();
     content = out.toString();
    } else{
     //Closes the connection.
     Log.w("HTTP1:",statusLine.getReasonPhrase());
     response.getEntity().getContent().close();
     throw new IOException(statusLine.getReasonPhrase());
    }
   } catch (ClientProtocolException e) {
    Log.w("HTTP2:",e );
    content = e.getMessage();
    error = true;
    cancel(true);
   } catch (IOException e) {
    Log.w("HTTP3:",e );
    content = e.getMessage();
    error = true;
    cancel(true);
   }catch (Exception e) {
    Log.w("HTTP4:",e );
    content = e.getMessage();
    error = true;
    cancel(true);
   }

   return content;
  }

  protected void onCancelled() {
   dialog.dismiss();
   Toast toast = Toast.makeText(AndroidListViewLoadMoreActivity.this, 
     "Error connecting to Server", Toast.LENGTH_LONG);
   toast.setGravity(Gravity.TOP, 25, 400);
   toast.show();

  }

  protected void onPostExecute(String content) {
   dialog.dismiss();
   Toast toast;
   if (error) {
    toast = Toast.makeText(AndroidListViewLoadMoreActivity.this, 
      content, Toast.LENGTH_LONG);
    toast.setGravity(Gravity.TOP, 25, 400);
    toast.show();
   } else {
    displayCountryList(content);
   }
  }

 }

 private void displayCountryList(String response){

  JSONObject responseObj = null; 

  try {

   Gson gson = new Gson();
   responseObj = new JSONObject(response); 
   JSONArray countryListObj = responseObj.getJSONArray("countryList");

   //countryList = new ArrayList<Country>();
   if(countryListObj.length() == 0){
    ListView listView = (ListView) findViewById(R.id.listView1);
    listView.removeFooterView(loadMoreView);
   }
   else {
    for (int i=0; i<countryListObj.length(); i++){
    //get the country information JSON object
    String countryInfo = countryListObj.getJSONObject(i).toString();
    //create java object from the JSON object
    Country country = gson.fromJson(countryInfo, Country.class);
    //add to country array list
    countryList.add(country);
    dataAdapter.add(country);
    }
         page++;
    dataAdapter.notifyDataSetChanged();
    loadingMore = false;
   }

  } catch (JSONException e) {
   e.printStackTrace();
  }

 } 

}

Сделать MyCustomAdapter.java в качестве адаптера

private class MyCustomAdapter extends ArrayAdapter<Country> {

  private ArrayList<Country> countryList;

  public MyCustomAdapter(Context context, int textViewResourceId, 
    ArrayList<Country> countryList) {
   super(context, textViewResourceId, countryList);
   this.countryList = new ArrayList<Country>();
   this.countryList.addAll(countryList);
  }

  private class ViewHolder {
   TextView code;
   TextView name;
   TextView continent;
   TextView region;
  }

  public void add(Country country){
   Log.v("AddView", country.getCode());
   this.countryList.add(country);
  }

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

   ViewHolder holder = null;
   Log.v("ConvertView", String.valueOf(position));
   if (convertView == null) {

   LayoutInflater vi = (LayoutInflater)getSystemService(
     Context.LAYOUT_INFLATER_SERVICE);
   convertView = vi.inflate(R.layout.country_info, null);

   holder = new ViewHolder();
   holder.code = (TextView) convertView.findViewById(R.id.code);
   holder.name = (TextView) convertView.findViewById(R.id.name);
   holder.continent = (TextView) convertView.findViewById(R.id.continent);
   holder.region = (TextView) convertView.findViewById(R.id.region);

   convertView.setTag(holder);

   } else {
    holder = (ViewHolder) convertView.getTag();
   }

   Country country = this.countryList.get(position);
   holder.code.setText(country.getCode());
   holder.name.setText(country.getName());
   holder.continent.setText(country.getContinent());
   holder.region.setText(country.getRegion());

   return convertView;

  }

 }
}

Создать Country.Java как pojo -

public class Country {

 String code = null;
 String name = null;
 String continent = null;
 String region = null;
 Double lifeExpectancy = null;
 Double gnp = null;
 Double surfaceArea = null;
 int population = 0;

 public String getCode() {
  return code;
 }
 public void setCode(String code) {
  this.code = code;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getContinent() {
  return continent;
 }
 public void setContinent(String continent) {
  this.continent = continent;
 }
 public String getRegion() {
  return region;
 }
 public void setRegion(String region) {
  this.region = region;
 }
 public Double getLifeExpectancy() {
  return lifeExpectancy;
 }
 public void setLifeExpectancy(Double lifeExpectancy) {
  this.lifeExpectancy = lifeExpectancy;
 }
 public Double getGnp() {
  return gnp;
 }
 public void setGnp(Double gnp) {
  this.gnp = gnp;
 }
 public Double getSurfaceArea() {
  return surfaceArea;
 }
 public void setSurfaceArea(Double surfaceArea) {
  this.surfaceArea = surfaceArea;
 }
 public int getPopulation() {
  return population;
 }
 public void setPopulation(int population) {
  this.population = population;
 }

}

Создать main.xml для основного макета

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent" android:layout_height="fill_parent"
 android:orientation="vertical">

 <TextView android:layout_width="fill_parent"
  android:layout_height="wrap_content" android:padding="10dp"
  android:text="@string/some_text" android:textSize="20sp" />

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

</LinearLayout>

Создать country_info.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="6dip" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Code: "
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:text="Name: "
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView2"
        android:layout_below="@+id/textView2"
        android:text="Continent: "
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView3"
        android:layout_below="@+id/textView3"
        android:text="Region: "
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/continent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView3"
        android:layout_alignBottom="@+id/textView3"
        android:layout_toRightOf="@+id/textView3"
        android:text="TextView" />

    <TextView
        android:id="@+id/region"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView4"
        android:layout_alignBottom="@+id/textView4"
        android:layout_alignLeft="@+id/continent"
        android:text="TextView" />

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textView3"
        android:layout_toRightOf="@+id/textView3"
        android:text="TextView" />

    <TextView
        android:id="@+id/code"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/textView2"
        android:layout_alignLeft="@+id/name"
        android:text="TextView" />

</RelativeLayout>

Footer View Text - loadmore.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:gravity="center_horizontal"
    android:padding="3dp"
    android:layout_height="fill_parent"> 

    <TextView
        android:id="@id/android:empty"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:padding="5dp"
        android:text="Loading more data..."/>

</LinearLayout>

Не забудьте указать разрешение на интернет с помощью

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

Ответ 5

Сначала вам нужен метод OnScrollListener, например:

private OnScrollListener onScrollListener() {
    return new OnScrollListener() {

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            int threshold = 1;
            int count = listView.getCount();

            if (scrollState == SCROLL_STATE_IDLE) {
                if (listView.getLastVisiblePosition() >= count - threshold && pageCount < 2) {
                    Log.i(TAG, "loading more data");
                    // Execute LoadMoreDataTask AsyncTask
                    //It reached ListView bottom
                    getDataFromUrl(url_page2);
                }
            }
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
                int totalItemCount) {
        }

    };
}

установите List List для просмотра прокрутки по listView.setOnScrollListener(onScrollListener());

У меня есть полный учебник ЗДЕСЬ! Вы можете посетить его!