1

AsyncTask.에서 정보를 수집하는 ArrayAdapter이 있습니다. AsyncTask은 스크롤 리스너에 의해 트리거됩니다. 사용자가 콘텐츠의 맨 아래로 스크롤하면 AsyncTask이 트리거되고 더 많은 콘텐츠를로드합니다. 문제는 리셋 버튼을 구현 한 것입니다. 이것이하는 일은 ArrayAdapter을 지우고 JSON을 통해 정보를 수집하는 PHP 스크립트로 전송되는 토큰을 재설정합니다. 재설정 버튼이 전혀 작동하지 않습니다. clear()을 호출하면 때때로 목록이 지워지고 새 데이터가 추가되지만 onScrollListener이 작동하지 않거나 목록을 지우지 않고 새 데이터를 목록의 맨 위에 추가합니다. 여기에 내 코드가있다.이 코드는 모두 같은 활동에있다. PHP 스크립트Clear() ArrayAdapter가 제대로 작동하지 않습니다 - Android

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"); 

이 클래스는 전역 변수가 포함되어 전송 토큰

GLOBAL CLASS. CommentID는 0으로 설정됩니다. 이것은 Json을 통해 PHP 스크립트로 전송됩니다. 일련의 주석을 수집 한 후, 마지막 주석의 ID로 CommentID를 재설정합니다. Reset 버튼을 클릭하면 Activity가 방금 시작된 것처럼 CommentID가 0으로 재설정됩니다. ArrayAdapter.ArrayAdapter에 전역 변수

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는 여러 항목을 수집하고이를 배치를 코멘트를 수집 용도

AsyncTask를 내가 시도하고 명확하지만 잘 밖으로 작동하지 않을 것입니다.

이는 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) { 
       } 
      } 

나는 문제는이 클래스에서 뭔가 발생하는 생각을 활성화 ON 스크롤 LISTENER이다. 나는 그곳에서 내가 무엇을 믿는 지 확신하지 못한다. 아래의 변수가 재설정되지 않았거나 뭔가가 있기 때문일 수 있습니다. 이것이 내가

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(); 

        } 

       } 
      }); 

사용자 정의 어댑터 ArrayAdapter와 리셋 방법입니다

INT firstVisibleItem, INT visibleItemCount, INT totalItemCount

내 어댑터의 이름이고 youListView이의 이름입니다 내 ListView. 누군가가 어댑터가 지워지지 않는 이유와 OnScrollListener이 작동하지 않는 이유를 설명해주십시오.

답변

5

Adapter.clear()를 호출 한 후에는 어댑터 변경 백업 데이터, 당신은 ListView에 변경 사항을 반영하기 위해 Adapter.notifyDataSetChanged()를 호출해야 할 때마다 기본적으로 Adapter.notifyDataSetChanged()

를 호출해야합니다.

+1

나는이 작업을 수행했으며 listView가 지워 졌는지 확인하지만 onscrollListener는 작동하지 않습니다. –

+1

음. 당신의 목록이 비어 있다면 아무 것도 스크롤 할 수 없습니다. 그렇게 명확하지 않습니다. – Varun

+1

사실 나는'new loadComments(). execute();'가 리셋되면 listView에 새로운 데이터를 추가하기 위해 코드가 호출됩니다. 액티비티가 방금 시작되었지만 onScrollListener가 작동하지 않는 경우와 동일한 데이터를 추가합니다. 마치 ArrayAdapter의 내용이 여전히 존재하는 것처럼 작동합니다. –

0

비슷한 문제가 발생했습니다. List.clear()ListAdapter.notifyDataSetChanged();이 문제를 해결 한 후 스크롤 리스너를 다시 인스턴스화하고 다시 첨부하는 것처럼 보입니다.

아마도 청취자는 List.clear() 이후에 junked됩니까?이전에 어떤 필터를 할 경우

1

, 당신은 작동하지 않는 경우에 호출 Adapter.notifyDataSetChanged();

+0

당신은 생명의 은인입니다! – Whitebear

0

전에 Adapter.getFilter().filter("");를 호출해야합니다. 보기에서 모든 항목을 제거 할 수도 있습니다. 그런 다음 다시 채우십시오. 당신은 AsyncTask를 호출하고 AsyncTask를이 작업을 완료 할 때를 다시 설정할 때

final int adapterCount = adapter.getCount(); 

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

봅니다 OnScrollListener listview's를 제거합니다.

관련 문제