2016-04-15 2 views
9

Я использую this для разбивки на страницы. Но у меня проблема, что она бесконечно прокручивает страницу. Напр. Если на моей последней странице есть продукты, меньшие лимита, то 4 продукта загружаются после 2 страниц по 20 продуктов каждый, а затем 4 продукта начинают бесконечно повторяться. Я использую следующий код, чтобы показать продукты:Бесконечный вопрос прокрутки с помощью EndlesScroll Android

 grid.setOnScrollListener(new EndlessScrollListener() { 
     @Override 
     public boolean onLoadMore(int page, int totalItemsCount) { 
      if (query != null || featureProductJson != null) { 
       return empty; 
      } 

      if (!empty && !loading) { 
       page++; 
       productList product = new productList(); 
       product.execute(category_id, String.valueOf(limit), String.valueOf(page)); 
      } 
      return empty; 
     } 
    }); 

Мой AsyncTask для загрузки продукта:

private class productList extends AsyncTask<String, Void, JSONObject> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     loading = true; 
     showProgressDialog(cpv); 
    } 

    @Override 
    protected JSONObject doInBackground(String... params) { 
     return NetworkAdapter.getProduct(getActivity(), prefs.getAccessToken(), params[0], params[1], params[2]); 
    } 

    @Override 
    protected void onPostExecute(JSONObject result) { 
     super.onPostExecute(result); 
     hideProgressDialog(cpv); 
     loading = false; 
     LogManager.e(TAG, "onPostExecute ============== :: " + result); 

     try { 
      if (result == null) { 
       return; 
      } 

      if (result.has("statusCode")) { 
       if (result.getInt("statusCode") == NetworkResponse.CONNECTION_ERROR) { 
        GeneralFunctions.showShortToast(getActivity(), getResources().getString(R.string.connection_error)); 
        return; 

       } else if (result.getInt("statusCode") == NetworkResponse.SYSTEM_ERROR) { 
        GeneralFunctions.showShortToast(getActivity(), result.getString("statusText")); 
        return; 
       } 
      } 


      String data = result.toString(); 
      Object json = new JSONTokener(data).nextValue(); 
      if (json instanceof JSONObject) { 

       //String obj = result.getString("success"); 
       boolean success = result.getBoolean("success"); 


       if (!success) { 
        empty = true; 
       } else { 
        JSONArray array = result.getJSONArray("data"); 
        for (int i = 0; i < array.length(); i++) { 
         JSONObject object = array.getJSONObject(i); 
         Product product = new Product(); 
         product.setName(object.getString("name")); 
         product.setImage(object.getString("image")); 
         product.setDesc(object.getString("description")); 
         product.setPrice(object.getString("price")); 
         product.setProductId(object.getString("id")); 
         product.setSpecialPrice(object.getString("special")); 
         product.setQuantity(object.getString("quantity")); 
         productList.add(product); 
        } 
        adapter.notifyDataSetChanged(); 
        page++; 
       } 
      } 
      //you have an object 
      else if (json instanceof JSONArray) { 

      } 
     } catch (JSONException e) { 
      empty = true; 
      e.printStackTrace(); 
     } 
    } 
} 

Пожалуйста, помогите, что я делаю неправильно.

Logcat:

04-15 12:32:11.157 4630-4630/com.eCommerce E/ProductFragment: onPostExecute ============== :: {"data":[{"length_class":"cm","location":"","tag":"samsung, galaxy, sduos, white","price_formated":"Rs4,500","weight_class_id":"1","mpn":"","height":"0.00000000","attribute_groups":[],"description":"<div class=\"sidebar\" id=\"column-left\">\n<div class=\"box category highlights\">\n<div class=\"box-heading\"><span>SPECIFICATIONS<\/span><\/div>\n<\/div>\n<\/div>\n<div class=\"box productcarousel\">\n<div class=\"box-heading \"><span>GENERAL FEATURES<\/span><\/div>\n<\/div>\n\n<table>\t<tbody style=\"margin: 0px; padding: 0px;\">\n\t\t\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Brand<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Samsung<\/td>\n\t\t<\/tr>\n\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Form<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Bar<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Call Features<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Loudspeaker<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Model Name<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Galaxy S Duos 3 VE<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Touch Screen<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Yes<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">SIM Type<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Dual Sim, GSM + GSM<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Model ID<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">SM-G316H<\/td>\n\t\t<\/tr>\n\t<\/tbody>\n<\/table>\n\n<div class=\"box productcarousel\"><div class=\"box-heading \"><span>MULTIMEDIA<\/span><\/div><\/div><table><tbody style=\"margin: 0px; padding: 0px;\">\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Video Player<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Yes<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Music Player<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Yes, Supports MP3<\/td>\n\t\t<\/tr>\n\t<\/tbody>\n<\/table>\n\n<div class=\"box productcarousel\"><div class=\"box-heading \"><span>CAMERA<\/span><\/div><\/div><table><tbody style=\"margin: 0px; padding: 0px;\">\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Video Recording<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Yes, 720 x 1280<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Flash<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">LED<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin 

04-15 12:32:11.247 4630-5268/com.eCommerce E/NetworkAdapter: SERVICE_URL ============== :: http://websiteaddresshere/index.php?route=feed/rest_api/products&category=92&limit=30&page=3 

04-15 12:32:17.947 4630-5268/com.eCommerce E/NetworkAdapter: Categories response ============== :: {"success":true,"data":[{"id":"1254","seo_h1":"","name":"Samsung Galaxy Sduos 3 White","manufacturer":"Samsung","sku":"","model":"SM-G316 White","image":"http:\/\/websiteaddresshere\/image\/cache\/catalog\/samsung\/sduos3w3-500x500.jpg","images":["http:\/\/websiteaddresshere\/image\/cache\/catalog\/samsung\/sduos3w3-500x500.jpg","http:\/\/websiteaddresshere\/image\/cache\/catalog\/samsung\/sduos3w2-500x500.jpg","http:\/\/websiteaddresshere\/image\/cache\/catalog\/samsung\/sduos3side-500x500.jpg"],"price":"4,500","price_formated":"Rs4,500","rating":0,"description":"<div class=\"sidebar\" id=\"column-left\">\n<div class=\"box category highlights\">\n<div class=\"box-heading\"><span>SPECIFICATIONS<\/span><\/div>\n<\/div>\n<\/div>\n<div class=\"box productcarousel\">\n<div class=\"box-heading \"><span>GENERAL FEATURES<\/span><\/div>\n<\/div>\n\n<table>\t<tbody style=\"margin: 0px; padding: 0px;\">\n\t\t\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Brand<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Samsung<\/td>\n\t\t<\/tr>\n\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Form<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Bar<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Call Features<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Loudspeaker<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Model Name<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Galaxy S Duos 3 VE<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Touch Screen<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Yes<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">SIM Type<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Dual Sim, GSM + GSM<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Model ID<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">SM-G316H<\/td>\n\t\t<\/tr>\n\t<\/tbody>\n<\/table>\n\n<div class=\"box productcarousel\"><div class=\"box-heading \"><span>MULTIMEDIA<\/span><\/div><\/div><table><tbody style=\"margin: 0px; padding: 0px;\">\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Video Player<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Yes<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Music Player<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Yes, Supports MP3<\/td>\n\t\t<\/tr>\n\t<\/tbody>\n<\/table>\n\n<div class=\"box productcarousel\"><div class=\"box-heading \"><span>CAMERA<\/span><\/div><\/div><table><tbody style=\"margin: 0px; padding: 0px;\">\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Video Recording<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; paddi 

04-15 12:32:17.987 4630-4630/com.eCommerce E/ProductFragment: onPostExecute ============== :: {"data":[{"length_class":"cm","location":"","tag":"samsung, galaxy, sduos, white","price_formated":"Rs4,500","weight_class_id":"1","mpn":"","height":"0.00000000","attribute_groups":[],"description":"<div class=\"sidebar\" id=\"column-left\">\n<div class=\"box category highlights\">\n<div class=\"box-heading\"><span>SPECIFICATIONS<\/span><\/div>\n<\/div>\n<\/div>\n<div class=\"box productcarousel\">\n<div class=\"box-heading \"><span>GENERAL FEATURES<\/span><\/div>\n<\/div>\n\n<table>\t<tbody style=\"margin: 0px; padding: 0px;\">\n\t\t\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Brand<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Samsung<\/td>\n\t\t<\/tr>\n\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Form<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Bar<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Call Features<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Loudspeaker<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Model Name<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Galaxy S Duos 3 VE<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Touch Screen<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Yes<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">SIM Type<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Dual Sim, GSM + GSM<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Model ID<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">SM-G316H<\/td>\n\t\t<\/tr>\n\t<\/tbody>\n<\/table>\n\n<div class=\"box productcarousel\"><div class=\"box-heading \"><span>MULTIMEDIA<\/span><\/div><\/div><table><tbody style=\"margin: 0px; padding: 0px;\">\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Video Player<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Yes<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Music Player<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Yes, Supports MP3<\/td>\n\t\t<\/tr>\n\t<\/tbody>\n<\/table>\n\n<div class=\"box productcarousel\"><div class=\"box-heading \"><span>CAMERA<\/span><\/div><\/div><table><tbody style=\"margin: 0px; padding: 0px;\">\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Video Recording<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Yes, 720 x 1280<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin: 0px; padding: 0px;\">\n\t\t\t<td class=\"specsKey\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">Flash<\/td>\n\t\t\t<td class=\"specsValue\" style=\"margin: 15px 0px; padding: 12px; vertical-align: top;\">LED<\/td>\n\t\t<\/tr>\n\t\t<tr style=\"margin 
+0

это категория идентификатор строки? – Jois

+0

да это строка –

+0

Можете ли вы разместить свой logCat – Jois

ответ

3

Устранена проблема, просто удалив шаг страницы в моем коде и отправив true to onLoadMore(); если ! пустой и ! погрузка.

grid.setOnScrollListener(new EndlessScrollListener() { 
     @Override 
     public boolean onLoadMore(int page, int totalItemsCount) { 
      if (query != null || featureProductJson != null) { 
       return empty; 
      } 

      if (!empty && !loading) { 
       productList product = new productList(); 
       product.execute(category_id, String.valueOf(limit), String.valueOf(page)); 
       return true; 
      } 
      return empty; 
     } 
    }); 
5

Проблема с начального анализа кода, кажется, что вы не написали какой-либо код, чтобы справиться с ситуацией, когда конец страницы достигается то есть не какой-либо больше предметов для загрузки.

Другая проблема может быть от конца API. Из логарифма кажется, что вы получаете одни и те же данные, даже если номер страницы превышает доступное количество страниц, я могу ошибаться, вам нужно будет проверить его. Например. только 2 страницы, а 2-я страница содержит 4 элемента. Каков ответ при прохождении страницы номер 3? Это то же самое, что и номер страницы 2 или пустой?

Приведите в действие какую-то логику в зависимости от ваших требований, чтобы найти, когда достигнут конец страницы, а затем прекратите выполнение задачи async, когда это произойдет.

Примечания стороны:

Пожалуйста, следуйте именованию классов Java Вы разбор отклика в методе onPostExecute пути преобразования datat в строку, а затем снова превращающую строку JSONTokener, что означает, что вы эффективно анализировать данные в потоке пользовательского интерфейса. Выполняйте разбор в методе doInBackground, так как это произойдет в рабочем потоке.

+0

Я получаю 4 продукта на третьей странице. Я проверил API от POSTMAN, он показывает {"success": false, "error": "No product found"} на 4-й странице. Но в моем случае мой код отправляет страницу 3 снова и снова после этого. –

+0

означает, что счетчик страниц не увеличивается. –

+0

, так что вам нужно будет поддерживать флаг наподобие endOfPageReached = false изначально, и когда вы получите сообщение false, а сообщение о найденном продукте не изменится на true и перестанет делать дальнейшие вызовы вашей асинхронной задачи –

0
grid.setOnScrollListener(new EndlessScrollListener() { 
    @Override 
    public boolean onLoadMore(int page, int totalItemsCount) { 
     if (query != null || featureProductJson != null) { 
      return empty; 
     } 

     if (!empty && !loading) { 
      productList product = new productList(); 
      product.execute(category_id, String.valueOf(limit), String.valueOf(page)); 
      return true; 
     } 
     return empty; 
    } 
}); 
Смежные вопросы