Бесконечный список прокрутки не работает

Я разрабатываю одно приложение. В моем приложении я использую listview для отображения данных из json. Все данные отображаются отлично. Но я хочу, чтобы отображать первые 10 объектов, а затем загружать элементы, которые должны отображаться, а затем отображать оставшиеся 10. Мой ответ json приведен ниже.

{ "interestsent": [ { "interestsent_user_id":369, "name":"abc", "profile_id":"686317", "image":"", }, { "interestsent_user_id":369, "name":"def", "profile_id":"686318", "image":"", }, { "interestsent_user_id":369, "name":"ghi", "profile_id":"686319", "image":"", }, { "interestsent_user_id":369, "name":"jkl", "profile_id":"686320", "image":"", }, { "interestsent_user_id":369, "name":"mno", "profile_id":"686321", "image":"", }, { "interestsent_user_id":369, "name":"pqr", "profile_id":"686322", "image":"", }, ................. ................. ] } 

Interestsent.java

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); INTEREST_SENT_URL = "http://fshdfh.com/webservice/interestsent?version=apps&user_login_id=00"; new GetData().execute(""); listview = (ListView) findViewById(R.id.listview); Log.i("DATA", "page ::onCreate onCreate onCreate "); mHandler = new Handler(); listview.setOnScrollListener(new EndlessScrollListener() { @Override public void onLoadMore(int page, int totalItemsCount) { Log.i("DATA", "page :: " + page + " totalItemsCount :: " + totalItemsCount); mProgressbar = new ProgressDialog(MainActivity.this); mProgressbar.setMessage("Loading..."); mProgressbar.show(); count++; if (count < maindata.size()) { if (adapter != null) { if (!isLoadingMore) { isLoadingMore = true; mHandler.postDelayed(loadMoreRunnable, 1000); } } } } }); } Runnable loadMoreRunnable = new Runnable() { @Override public void run() { // TODO Auto-generated method stub if (count < maindata.size()) { if (adapter != null) { adapter.addAll(maindata.get(count)); mHandler.removeCallbacks(loadMoreRunnable); isLoadingMore = false; if (mProgressbar.isShowing()) mProgressbar.dismiss(); } } } }; static  ArrayList<ArrayList> chunkList(List list, final int L) { ArrayList<ArrayList> parts = new ArrayList<ArrayList>(); final int N = list.size(); for (int i = 0; i < N; i += L) { parts.add(new ArrayList(list.subList(i, Math.min(N, i + L)))); } return parts; } private ProgressDialog mProgressbar; public class GetData extends AsyncTask { ArrayList data = new ArrayList(); @Override protected void onPreExecute() { // TODO Auto-generated method stub mProgressbar = new ProgressDialog(MainActivity.this); mProgressbar.setMessage("Loading..."); mProgressbar.show(); super.onPreExecute(); } @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub ArrayList<ArrayList> data = new ArrayList<ArrayList>(); ServiceHandler sh = new ServiceHandler(); /*try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }*/ /*for (int i = 0; i  " + jsonStr); if (jsonStr != null) { try { JSONObject jsonObj = new JSONObject(jsonStr); // Getting JSON Array node interestsent = jsonObj.getJSONArray(INTEREST_SENT); // looping through All Contacts for (int i = 0; i < interestsent.length(); i++) { JSONObject c = interestsent.getJSONObject(i); // creating new HashMap // HashMap<ArrayList map = new HashMap(); HashMap map = new HashMap(); // adding each child node to HashMap key => value map.put(INTEREST_USER_ID, c.getString(INTEREST_USER_ID)); map.put(INTEREST_SENT_NAME,c.getString(INTEREST_SENT_NAME)); map.put(INTEREST_SENT_PROFILE, c.getString(INTEREST_SENT_PROFILE)); map.put(INTEREST_SENT_IMAGE, c.getString(INTEREST_SENT_IMAGE)); map.put(INTEREST_SENT_CAST, c.getString(INTEREST_SENT_CAST)); map.put(INTEREST_SENT_AGE, c.getString(INTEREST_SENT_AGE)+" years"); map.put(INTEREST_SENT_LOCATION, c.getString(INTEREST_SENT_LOCATION)); // adding HashList to ArrayList data.addAll(map); } } catch (JSONException e) { e.printStackTrace(); } } else { Log.e("ServiceHandler", "Couldn't get any data from the url"); } return data; } @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub super.onPostExecute(result); maindata = chunkList(data, 50); Log.i("DATA", "maindata :: " + maindata.size()); adapter = new CustomAdapterSent(maindata.get(count), MainActivity.this); listview.setAdapter(adapter); if (mProgressbar.isShowing()) mProgressbar.dismiss(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } 

EndlessScroolListener.java

  public abstract class EndlessScrollListener implements OnScrollListener { // The minimum amount of items to have below your current scroll position // before loading more. private int visibleThreshold = 5; // The current offset index of data you have loaded private int currentPage = 0; // The total number of items in the dataset after the last load private int previousTotalItemCount = 0; // True if we are still waiting for the last set of data to load. private boolean loading = true; // Sets the starting page index private int startingPageIndex = 0; public EndlessScrollListener() { } public EndlessScrollListener(int visibleThreshold) { this.visibleThreshold = visibleThreshold; } public EndlessScrollListener(int visibleThreshold, int startPage) { this.visibleThreshold = visibleThreshold; this.startingPageIndex = startPage; this.currentPage = startPage; } // This happens many times a second during a scroll, so be wary of the code you place here. // We are given a few useful parameters to help us work out if we need to load some more data, // but first we check if we are waiting for the previous load to finish. @Override public void onScroll(AbsListView view,int firstVisibleItem,int visibleItemCount,int totalItemCount) { // If the total item count is zero and the previous isn't, assume the // list is invalidated and should be reset back to initial state if (totalItemCount  previousTotalItemCount)) { loading = false; previousTotalItemCount = totalItemCount; currentPage++; } // If it isn't currently loading, we check to see if we have breached // the visibleThreshold and need to reload more data. // If we do need to reload some more data, we execute onLoadMore to fetch the data. if (!loading && (totalItemCount - visibleItemCount)<=(firstVisibleItem + visibleThreshold)) { onLoadMore(currentPage + 1, totalItemCount); loading = true; } } // Defines the process for actually loading more data based on page public abstract void onLoadMore(int page, int totalItemsCount); @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // Don't take any action on changed } } 

CustomAdapterSent.java

Открытый class CustomAdapterSent расширяет BaseAdapter {

 private ArrayList mData = new ArrayList(); private Context mContext; private LayoutInflater inflater = null; private static final String TAG_NAME="name"; private static final String TAG_PROFILE="profile_id"; private static final String TAG_IMAGE="image"; private static final String TAG_CAST="cast"; private static final String TAG_AGE="age"; private static final String TAG_LOCATION="location"; public CustomAdapterSent(ArrayList mData, Context mContext) { this.mContext = mContext; this.mData = mData; inflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public void addAll(ArrayList mmData) { this.mData.addAll(mmData); this.notifyDataSetChanged(); } @Override public int getCount() { // TODO Auto-generated method stub return mData.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return mData.get(arg0); } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return 0; } class ViewHolder { public TextView txtView; TextView txtproname; } @Override public View getView(int postion, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View view = convertView; ViewHolder holder; if (view == null) { view = inflater.inflate(R.layout.row_layout, null); holder = new ViewHolder(); ///holder.propic = (ImageView) convertView.findViewById(R.id.propicsent); // holder.txtproname = (TextView) convertView.findViewById(R.id.txtpronameintsent); //holder.txtproid = (TextView) convertView.findViewById(R.id.txtproidsent); //holder.txtprofilecast = (TextView) convertView.findViewById(R.id.txtprofilecastintsent); //holder.txtprofileage = (TextView) convertView.findViewById(R.id.txtprofileageintsent); // holder.txtprofileplace = (TextView) convertView.findViewById(R.id.txtprofileplaceintsent); holder.txtView = (TextView) view.findViewById(R.id.no_intsent); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } Log.i("DATA", "mData.get(postion) :: " + mData.get(postion)); mData.get(postion); // holder.txtproname.setText(listData.get(position).get(TAG_NAME)); holder.txtView.setText("Index :: " + Integer.getInteger(TAG_NAME)); return view; } } 

Файл XML:

      

Чтобы отобразить только 10 элементов в ListView и показать больше элементов в прокрутке, выполните следующие действия:

ШАГ 1. Создайте метод chunkList который делит ArrayList на части размером 10:

 static  List> chunkList(List list, final int L) { List> parts = new ArrayList>(); final int N = list.size(); for (int i = 0; i < N; i += L) { parts.add(new ArrayList( list.subList(i, Math.min(N, i + L))) ); } return parts; } 

ШАГ 2. Создайте ArrayList и счетчик, отображающий текущую часть:

  private boolean isLoadingMore=false; Handler mHandler = new Handler(); List>> mainArrayList; private int count=0; 

ШАГ 3: В onPostExecute result разрыва и отображение данных в ListView:

 protected void onPostExecute(ArrayList> result) { super.onPostExecute(result); // your code here... mainArrayList=chunkList(result,10); isLoadingMore=false; count=0; adapter = new CustomAdapterSent(Interestsent.this, mainArrayList.get(count)); setListAdapter(adapter); } } 

ШАГ 4: Создайте метод addAll в Adapter для добавления данных в текущий источник данных:

 public void addAll(ArrayList> moreData){ this.listData.addAll(moreData); this.notifyDataSetChanged(); } 

ШАГ 5: В onLoadMore загружать больше данных в ListView:

 mHandler = new Handler(); listview.setOnScrollListener(new EndlessScrollListener() { @Override public void onLoadMore(int page, int totalItemsCount) { if(count 

Чтобы иметь AdapterView (например, ListView или GridView), который автоматически загружает больше элементов, когда пользователь прокручивает элементы (или бесконечный прокрутки). Это делается путем запуска запроса на получение большего количества данных, как только пользователь пересекает порог оставшихся элементов до того, как они достигнут конца. Каждый AdapterView поддерживает привязку к событиям OnScrollListener, которые запускаются всякий раз, когда пользователь прокручивает коллекцию. Используя эту систему, мы можем определить базовый EndlessScrollListener, который поддерживает большинство случаев использования, создавая собственный class, который расширяет OnScrollListener.

Об этом можно узнать в следующих ссылках:

Бесконечная прокрутка ListView в Android

Бесконечная прокрутка с помощью адаптера

Просмотр бесконечного списка прокрутки

Более простой подход добавления данных в listview был показан в этом SO-ответе: Android Endless List

Надеюсь это поможет …

  • Как выйти из приложения Java из программы
  • Можно ли использовать Java 8 для разработки Android?
  • Как изменить десятичный разделитель DecimalFormat от запятой до точки / точки?
  • Почему окончательная переменная должна быть инициализирована до завершения конструктора?
  • Java: вызов метода внешнего classа в анонимном внутреннем classе
  • 2-мерный список массивов
  • Как мне отображать закругленные углы в Android?
  • RecyclerView - просмотр в определенном положении
  • Код будет возвращать 0.0, 0.0 GPS-координату при бросании NullPointerException
  • Как изменить цвет значка гамбургера в ящике для рисования материалов
  • Java: Идентификатор ожидается
  • Interesting Posts

    WD My Book, создавая странные звуки (не похож на Click of Death)

    Второй раздел SD-карты не распознан

    Как заставить YY_INPUT указывать на строку, а не на stdin в Lex & Yacc (Solaris)

    Как установить Datasource при создании Hibernate SessionFactory?

    8 ГБ оперативной памяти в 32-битной операционной системе

    web.config перенаправляет не-www на www

    Как вы собираете визуальный проект студии c ++ для выпуска?

    Ошибка производительности XmlSerializer при указании XmlRootAttribute

    Генерирование выражений парсера Spirit из вариационного списка альтернативных выражений парсера

    Функция триггера jquery, когда элемент находится в viewport

    Какой твой любимый мультфильм «программист»?

    Плавающая или вертикальная панель результатов в SQL Server Management Studio

    Могу ли я использовать break для выхода из нескольких вложенных циклов?

    Шаг в свойство / функцию (F11) не работает должным образом

    Есть ли способ заставить ПК выглядеть как USB-накопитель на устройстве, которое считывает содержимое с USB-накопителя?

    Давайте будем гением компьютера.