1

У меня есть ArrayAdapter, который собирает информацию с AsyncTask.. AsyncTask запускается на прослушивающем прокрутке. Когда пользователь прокручивает нижнюю часть содержимого, запускается AsyncTask и загружает больше контента. Проблема в том, что я внедрил кнопку сброса. То, что это делает, очищает ArrayAdapter и сбрасывает токены, которые отправляются через JSON в скрипт php, который собирает информацию. Кнопка сброса не работает вообще. Когда я звоню clear(), он иногда очищает список, а затем добавляет новые данные, но тогда onScrollListener не работает или он не очищает список и просто добавляет новые данные в начало списка. Вот мой код, весь этот код находится в том же самом действии.Clear() ArrayAdapter не работает должным образом - Android

GLOBAL КЛАСС ДЛЯ лексем ПОСЛАН К PHP SCRIPT

class CommentInfo { 

        public CommentInfo() {} 
        private String commentID; 
        private int gatheredComments; 
        private int totalComments; 

        public String getCommentID(){ 
        return commentID; 
        } 
        public void setCommentID(String c){ 
        commentID = c; 
        } 

        public int getGatheredComments(){ 
         return gatheredComments; 
         } 
         public void setGatheredComments(int forNumber){ 
         gatheredComments = forNumber; 
         } 


       }//end commentInfor class 
      final CommentInfo info = new CommentInfo(); 
      info.setCommentID("0"); 

Этот класс содержит глобальные переменные. CommentID установлен в 0. Это отправляется на PHP-скрипт через Json. После того, как он соберет группу комментариев, он сбрасывает идентификатор CommentID в ID последнего собранного комментария. Когда нажата кнопка «Сброс», она сбрасывает значение CommentID в 0, как если бы активность только начиналась.

AsyncTask, собирающий КОММЕНТАРИИ И ИСПОЛЬЗУЕТ глобальные переменные

class loadComments extends AsyncTask<JSONObject, String, JSONObject> { 



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

        progDailog.getWindow().setGravity(Gravity.BOTTOM); 
        progDailog.setIndeterminate(false); 
        progDailog.setCancelable(false); 
        progDailog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); 
        progDailog.show(); 
        progDailog.setContentView(R.layout.progress_circle); 





       } 

       @Override 
       protected void onProgressUpdate(String... values) { 
        super.onProgressUpdate(values); 

       } 

       protected JSONObject doInBackground(JSONObject... params) { 


        JSONObject json2 = CollectComments.collectComments(usernameforcomments, info.getCommentID()); 


         return json2; 



       } 

       @Override 
       protected void onPostExecute(JSONObject json2) { 

        progDailog.dismiss(); 

        try { 
         if (json2.getString(KEY_SUCCESS) != null) { 
          registerErrorMsg.setText(""); 
          String res2 = json2.getString(KEY_SUCCESS); 
          if(Integer.parseInt(res2) == 1){ 



           JSONArray commentArray = json2.getJSONArray(KEY_COMMENT); 
           String comments[] = new String[commentArray.length()]; 
           for (int i=0; i<commentArray.length(); i++) { 
            comments[i] = commentArray.getString(i); 
           } 
           JSONArray contentsArray = json2.getJSONArray(KEY_CONTENT); 
           String contents[] = new String[contentArray.length()]; 
           for (int i=0; i<contentArray.length(); i++) { 
            contents[i] = contentArray.getString(i); 
           } 
           JSONArray usernameArray = json2.getJSONArray(KEY_USERNAME); 
           String usernames[] = new String[usernameArray.length()]; 
           for (int i=0; i<usernameArray.length(); i++) { 
            usernames[i] = usernameArray.getString(i); 
           } 


          final List <Item> tempList2 = new ArrayList <Item>(); 

          String tempForNumber = json2.getString(KEY_COMMENTS_GATHERED); 
          int forNumber = Integer.parseInt(tempForNumber); 

           for (int x = 0; x < forNumber;x++){ 
            tempList2.add (new Item (usernames [x], contents[x], comments[x])); 
            } 




           customAdapter.addAll(tempList2); 

           String commentID = json2.getString(KEY_COMMENT_ID); 

           info.setCommentID(commentID); 
           info.setGatheredComments(forNumber); 

           if (info.getTotalComments() >= Integer.parseInt(json2.getString(KEY_NUMBER_OF_COMMENTS))){  

            int tempNum = Integer.parseInt(json2.getString(KEY_NUMBER_OF_COMMENTS)); 
            info.setTotalComments(tempNum); 

           } 


            try 
            { 

               Thread.sleep(1000); 
            } 
                 catch(Exception e) 
                 { 
                  e.printStackTrace(); 
                 } 

           }//end if key is == 1 
          else{ 
           // Error in registration 
           registerErrorMsg.setText(json2.getString(KEY_ERROR_MSG)); 
          }//end else 
         }//end if 
        } //end try 

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


       } 


      } 

Asynctask собирает несколько элементов и помещает их в ArrayAdapter. это ArrayAdapter то, что я стараюсь ясно, но он никогда не работает правильно.

ЭТО НА SCROLL LISTENER, который активирует AsyncTask

class EndlessScrollListener implements OnScrollListener { 
       private int visibleThreshold = 5; 
       private boolean loading = true; 

       public EndlessScrollListener() { 
       } 
       public EndlessScrollListener(int visibleThreshold) { 
        this.visibleThreshold = visibleThreshold; 
       } 

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


        if (loading) { 
         if (totalItemCount > previousTotal) { 
          loading = false; 
          previousTotal = totalItemCount; 
         } 
       } 
        if (!loading && (firstVisibleItem + visibleItemCount) == totalItemCount) { 

         new loadComments().execute(); 
         loading = true; 
        } 




       } 

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

Я считаю, что проблема возникает из-за чего-то в этом классе. Я не уверен, во что я верю. Может быть, потому, что перечисленные ниже переменные не сбрасываются или что-то в этом роде.

INT firstVisibleItem, внутр visibleItemCount, внутр totalItemCount

ЭТО КАК СБРОСИТЬ ARRAYADAPTER

refresh = (ImageView) findViewById(R.id.refresh); 

      refresh.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        if(customAdapter!= null) 
        { 
         customAdapter.clear(); 
         info.setCommentID("0"); 
         info.setGatheredComments(0); 
         yourListView.smoothScrollToPosition(0); 
         new loadComments().execute(); 

        } 

       } 
      }); 

пользовательский адаптер имя моего адаптера и youListView это имя my ListView. Пожалуйста, помогите объяснить, почему адаптер не очищается, и если он OnScrollListener перестает работать.

ответ

5

После вызова Adapter.clear() вам нужно позвонить Adapter.notifyDataSetChanged()

В основном всякий раз, когда данные, поддерживающие изменения адаптера, необходимо вызвать Adapter.notifyDataSetChanged(), чтобы отразить изменения на ListView.

+1

Я сделал это, и он убедится, что listView очищен, но onscrollListener не работает. –

+1

Ну. если ваш список пуст, вам нечего прокручивать. Разве это не очевидно. – Varun

+1

На самом деле я поместил код 'new loadComments(). Execute();' вызывается однажды, когда я нажимаю reset, чтобы он добавлял новые данные в listView. Он добавляет те же данные, что и активность только что началась, но onScrollListener не работает. Он действует так, как будто содержимое ArrayAdapter все еще существует. –

0

Только что столкнулся с подобной проблемой. Кажется, повторное создание и повторное прикрепление прослушивателя прокрутки после List.clear() и после того, как ListAdapter.notifyDataSetChanged(); решает проблему.

Возможно, прослушиватель отправлен после List.clear()?

1

Если вы делаете какой-либо фильтр раньше, вам нужно позвонить Adapter.getFilter().filter(""); перед вызовом Adapter.notifyDataSetChanged();

+0

Ты спасатель! – Whitebear

0

Иногда это не работает. Вы также можете удалить все элементы из представления. А потом заселите.

final int adapterCount = adapter.getCount(); 

    for (int i = 0; i < adapterCount; i++) { 
     View item = adapter.getView(i, null, null); 
     myLayout.removeView(item); 
    } 
0

Попытка удалить listview's OnScrollListener при вызове AsyncTask и установить его обратно, когда AsyncTask заканчивает свою работу.

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