Listview项目getView一次又一次地重复

时间:2013-06-11 13:14:10

标签: java android eclipse

我在android

中使用以下代码作为ListView的Cusotm数组适配器

在查看新的MyAsyncTask(url,callback);将一次又一次地运行,我怎样才能使服务器的查询只执行一次。

@Override
        public View getView(int position, View convertView, ViewGroup parent) 
        {       
            final Question question = quesions.get(position);
            final OpenionUser myUser = question.getUser();

            View view = convertView;
            ViewHolder viewHolder = new ViewHolder();

            if (convertView == null)
            {
                view = inflator.inflate(R.layout.question_adapter_layout, parent, false);

                viewHolder.firstPhotoPercent  = (TextView) view.findViewById(R.id.firstPhotoProgressText);
                viewHolder.secondPhotoPercent = (TextView) view.findViewById(R.id.secondPhotoProgressText);

                viewHolder.comments = (LinearLayout) view.findViewById(R.id.commentsListView);      

                viewHolder.profilePic = (ImageButton) view.findViewById(R.id.profile);
                viewHolder.leftPic = (ImageButton) view.findViewById(R.id.photo1);
                viewHolder.rightPic = (ImageButton) view.findViewById(R.id.photo2);

                viewHolder.firstPhotoBg = (RelativeLayout) view.findViewById(R.id.firstPhotoProgress);
                viewHolder.secondPhotoBg = (RelativeLayout) view.findViewById(R.id.secondPhotoProgress);

                view.setTag(viewHolder);
            }
            else
                viewHolder = (ViewHolder) view.getTag();

    //      //imageLoader.displayImage(myUser.getProfilePicture(), viewHolder.profilePic, options);
    //      
            viewHolder.username.setText(myUser.getUserName());
            viewHolder.question.setText(question.getQuestion());

            imageLoader.displayImage(question.getRightThumbnailLink(), viewHolder.rightPic, options);
            imageLoader.displayImage(question.getLeftThumbnailLink(), viewHolder.leftPic, options);

            String url = String.format(Constants.GET_QUESTION_COMMENTS, 
                        question.getId(),
                        0,
                        2);

            ResponseCallback callback = new ResponseCallback() 
            {
                @Override
                public void onSuccess(HttpResponse response) 
                {
                    try {
                            JSONObject obj = new JSONObject(Utilities.convertStreamToString(response.getEntity().getContent()));
                            JSONArray array = obj.getJSONArray("comments");
                            ArrayList<Comment> comments = new ArrayList<Comment>();
                            for (int i = 0; i < array.length(); i ++)
                            {
                                Comment comment = Utilities.getCommentFromJSON(array.getJSONObject(i));
                                comments.add(comment);                          
                            }
                            addFeaturedViews(comments, viewHolder.comments);

                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }




                }


                @Override
                public void onFailure(HttpResponse exception) 
                {

                }
            };

            new MyAsyncTask(url, callback);

4 个答案:

答案 0 :(得分:1)

“绝对不能保证调用getView()的顺序也不能保证多少次”(Romain Guy @ here)。例如,当元素离开屏幕然后在滚动ListView后再次出现时,会调用此方法。因此,您永远不应该从getView调用您的服务器:相反,您应该在适配器外部执行asynctask(例如,在实例化适配器之前的片段或活动中),然后在列表上调用notifyDataSetChanged。

答案 1 :(得分:0)

你可以试试这个:

if(position==0)
{
    new MyAsyncTask(url, callback);
}

* 在看到Dhanesh Budhrani在下面的评论中提供的信息后修改答案*

如果你想运行新的MyAsyncTask(url,callback);只有一次,你可以试试这个:

 if(firsttime)
 {
     firsttime = false;
     new MyAsyncTask(url, callback);
 }

这里 firsttime 是在适配器的构造函数中初始化为true的布尔变量。

答案 2 :(得分:0)

正如评论中已经提到的,适配器的任务是为ListView提供要呈现的视图。您应该在另一个类中处理数据请求,将数据提供给Adapter,然后在ArrayAdapter上调用notifyDataSetChanged。

答案 3 :(得分:0)

由于适配器类直接与ListView交互,因此正确的方法是不直接调用任何线程。当您将滚动ListView / View时,将一次又一次地调用getView()方法,并且将调用AsyncTask阻碍ListView的顺畅流动。

为了处理这种情况,请调用Activity类中的AsyncTask,并在 onSuccess() 中获取结果后立即定义CustomAdapterClass并调用其中包含 listView.setAdapter(customAdapter) ,并将ArrayList中的数据作为 CustomArrayAdapter(ArrayList arrayListJsonResponse)的构造函数传递 strong>并夸大数据。

希望它有所帮助。感谢。