【问题标题】:Clear( ) ArrayAdapter not working properly - AndroidClear() ArrayAdapter 无法正常工作 - Android
【发布时间】:2013-08-30 00:34:51
【问题描述】:

我有一个ArrayAdapter,它从AsyncTask. 收集信息AsyncTask 由滚动监听器触发。当用户滚动到内容底部时,AsyncTask 被触发并加载更多内容。问题是我已经实现了一个重置​​按钮。这样做是清除 ArrayAdapter 并将通过 JSON 发送的令牌重置为收集信息的 php 脚本。重置按钮根本不起作用。当我调用clear() 时,它有时会清除列表然后添加新数据,但随后onScrollListener 不起作用,或者它不会清除列表,只是将新数据添加到列表顶部。这是我的代码,所有这些代码都在同一个活动中。

发送到 PHP 脚本的令牌的全局类

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。这通过 Json 发送到 php 脚本。在它收集到一组 cmets 后,它会将 CommentID 重置为最后收集到的评论的 ID。单击重置按钮时,它会将 CommentID 重置为 0,就像 Activity 刚刚开始一样。

收集评论和使用全局变量的异步任务

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 是我尝试清除的,但它永远不会正确。

这是激活异步任务的滚动监听器

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,int visibleItemCount, int totalItemCount

这就是我重置阵列适配器的方式

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

                    }

                }
            });

custom Adapter 是我的适配器的名称,youListView 是我的 ListView. 的名称 请有人帮忙解释为什么适配器无法清除,如果它清除了,OnScrollListener 将停止工作。

【问题讨论】:

    标签: android listview android-asynctask global-variables android-arrayadapter


    【解决方案1】:

    拨打Adapter.clear()后需要拨打Adapter.notifyDataSetChanged()

    基本上每当支持适配器的数据发生更改时,您都需要调用Adapter.notifyDataSetChanged() 以反映ListView 上的更改。

    【讨论】:

    • 我已经这样做了,它确保 listView 被清除,但是 onscrollListener 不会工作。
    • 好吧。如果您的列表为空,则没有可滚动的内容。这不是很明显吗。
    • 实际上我放置了代码new loadComments().execute();,一旦我点击重置就会调用它,它会将新数据添加到listView。它添加的数据与活动刚开始时相同,但 onScrollListener 不起作用。就好像 ArrayAdapter 的内容仍然存在一样。
    • 当您说“onScrollListener 不起作用”时,您到底是什么意思。你希望它做什么>?
    • 它假设当它到达ListView的底部时调用AsyncTask。它计算列表视图中有多少项目,然后可以检测最后一个视图何时显示。然后它调用 AsyncTask。问题是它不知道我清除了列表并将其他视图计为视图总数的一部分,因此它不会检测到我在列表视图的底部
    【解决方案2】:

    如果你之前做任何过滤,你需要在调用Adapter.notifyDataSetChanged();之前调用Adapter.getFilter().filter("");

    【讨论】:

    • 你是一个救生员!
    【解决方案3】:

    刚刚遇到类似的问题。在List.clear()ListAdapter.notifyDataSetChanged(); 解决问题之后,似乎重新实例化并重新附加了滚动侦听器。

    也许监听器在List.clear() 之后被垃圾了?

    【讨论】:

      【解决方案4】:

      有时这不起作用。您还可以从视图中删除所有项目。然后重新填充。

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

      【讨论】:

        【解决方案5】:

        尝试在调用 asynctask 时删除 listview 的 OnScrollListener,并在 asynctask 完成其工作时将其重新设置。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-10
          • 2012-09-13
          • 2012-03-24
          • 2012-11-03
          • 2013-11-24
          • 1970-01-01
          相关资源
          最近更新 更多