2014-01-26 2 views
0

Я пытаюсь загрузить некоторое количество других элементов в моем ListView, когда я прокручиваю нижнюю часть и только ADD их текущим. Он работает хорошо, но недавно я узнал, что он загружает ВСЕ объектов снова, только с большим количеством предметов. Я использую Parse.com. Я обнаружил, что Parse.com предоставляет свой собственный ParseQueryAdapter, который содержит метод getNextPageView(). Он загружает элементы перемещения, но только когда пользователь нажимает кнопку ниже. Я также пробовал метод .setSkip(someNumber), но он только стирает/скрывает someNumber элементов в верхней части. Поэтому я все еще хочу использовать OnScrollListener и действительно load-more и не загружать снова и больше.Android: Сохранение элементов ListView и загрузка/добавление

У вас есть идеи, как это сделать?

проверить свои коды:

public void updateData() { 
     mListView = (ListView)getView().findViewById(R.id.animal_list);  
    final ParseQuery<Animal> query = ParseQuery.getQuery(Animal.class); 


    query.setCachePolicy(CachePolicy.NETWORK_ONLY); 
    query.orderByAscending("animal"); 


    query.setLimit(mListView.getCount() + 5); 


    query.findInBackground(new FindCallback<Animal>() { 

     @Override 
      public void done(List<Animal> animals, ParseException error) { 

       if(animals != null){ 
        mAdapter.clear(); 

       mProgressBar = (ProgressBar) getView().findViewById (R.id.loading_animals); 
       mProgressBar.setVisibility(View.INVISIBLE); 
      RelativeLayout footie = (RelativeLayout) getView().findViewById(R.id.footerview); 
      footie.setVisibility(View.VISIBLE); 

      for (int i = 0; i < animals.size(); i++) { 


         mAdapter.add(animals.get(i)); 
        ArrayList<Animal> animal = new ArrayList<Animal>(); 
        animal.add(animals.get(i)); 






        } 

       } 
      } 
     }); } 






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


     @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); } 

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

       return null; 



     } 


     @Override 
      protected void onPostExecute(Void result) { 


       mListView = (ListView) getView().findViewById(R.id.animal_list); 

       mEditText = (EditText) getView().findViewById(R.id.search_animal); 

       mAdapter = new AnimalAdapter(getActivity(), new ArrayList<Animal>()); 

       mListView.setVisibility(View.VISIBLE); 
       mListView.setTextFilterEnabled(true); 
       mListView.setAdapter(mAdapter); 




       mListView.setOnScrollListener(new OnScrollListener() { 

        @Override 
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, 
          int totalItemCount) { 
         final int lastItem = firstVisibleItem + visibleItemCount; 
         if(lastItem == totalItemCount) { 




         if (mListView.getCount() > 20) { 

          RelativeLayout footie = (RelativeLayout) getView().findViewById(R.id.footerview); 

          mListView.removeFooterView(footie); 

           } 





          else{ 

            updateData(); 
           } 

          } 

         } 

        } 

Заранее спасибо

ответ

1

Попробуйте очистить Adapter перед установкой его ListView как выглядит следующим образом:

public void updateData() { 
     mListView = (ListView)getView().findViewById(R.id.animal_list);  
    final ParseQuery<Animal> query = ParseQuery.getQuery(Animal.class); 


    query.setCachePolicy(CachePolicy.NETWORK_ONLY); 
    query.orderByAscending("animal"); 


    query.setLimit(mListView.getCount() + 5); 


    query.findInBackground(new FindCallback<Animal>() { 

     @Override 
      public void done(List<Animal> animals, ParseException error) { 

       if(animals != null){ 
        mAdapter.clear(); 

       mProgressBar = (ProgressBar) getView().findViewById (R.id.loading_animals); 
       mProgressBar.setVisibility(View.INVISIBLE); 
      RelativeLayout footie = (RelativeLayout) getView().findViewById(R.id.footerview); 
      footie.setVisibility(View.VISIBLE); 
        mAdapter.clear();///////HERE 

      for (int i = 0; i < animals.size(); i++) { 


         mAdapter.add(animals.get(i)); 
        ArrayList<Animal> animal = new ArrayList<Animal>(); 
        animal.add(animals.get(i)); 






        } 

       } 
      } 
     }); } 






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


     @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); } 

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

       return null; 



     } 


     @Override 
      protected void onPostExecute(Void result) { 


       mListView = (ListView) getView().findViewById(R.id.animal_list); 

       mEditText = (EditText) getView().findViewById(R.id.search_animal); 

       mAdapter = new AnimalAdapter(getActivity(), new ArrayList<Animal>()); 

       mListView.setVisibility(View.VISIBLE); 
       mListView.setTextFilterEnabled(true); 
       mListView.setAdapter(mAdapter); 




       mListView.setOnScrollListener(new OnScrollListener() { 

        @Override 
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, 
          int totalItemCount) { 
         final int lastItem = firstVisibleItem + visibleItemCount; 
         if(lastItem == totalItemCount) { 




         if (mListView.getCount() > 20) { 

          RelativeLayout footie = (RelativeLayout) getView().findViewById(R.id.footerview); 

          mListView.removeFooterView(footie); 

           } 





          else{ 

            updateData(); 
           } 

          } 

         } 

        } 

Вы только добавление элементов без стирания предыдущей данные.

+0

Большое спасибо Усама !! Он работал хорошо. Кстати, у вас есть идея, как проверить, не изменились ли объекты в ListView/Adapter? Или проверить общее количество элементов ParseQuery? Ive сделал query.count(); но он кажется очень медленным, поэтому я думаю, что он делает этот метод более одного раза или около того. И почему? Потому что мне нужно установить оператор if (mListView.getCount() == ParseQuery число объектов) -> сделать что-то – marson

+0

Не могли бы вы отменить мой ответ в качестве принятого ответа, а затем обновить страницу, а затем повторно забрать мою страницу ответа и обновления. Я не получил 15 повторений. –

+0

OkaY, я сделал это. Есть ли у вас какие-либо идеи ? – marson

Смежные вопросы