Результат выполнения асинхронной задачи не может быстро загружаться и изменять значение после просмотра списка прокрутки

#android #listview #android-asynctask #android-adapter #convertview

#Android #listview #android-asynctask #android-адаптер #convertview

Вопрос:

У меня есть адаптер, а внутри адаптера есть асинхронная задача. Показать значок макета не может загружаться быстро, и когда я прокручиваю значение, оно меняется случайным образом.

Мой адаптер

 private class MyAdapter extends ArrayAdapter<MyClass> {
        ConvertView holder = null;


        public MyAdapter(Context context, int resource, int textViewResourceId, List<MyClass> objects) {
            super(context, resource, textViewResourceId, objects);
            mInflater = LayoutInflater.from(context);

        }

        public int getCount() {

            return myclassList.size();
        }

        public MyClass getItem(int position) {
            return myclassList.get(position);
        }

        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            final TextView txtTestKode, txtTestName, txtTestStatus;
            final RelativeLayout layoutBadge;

            final MyClass data = getItem(position);


            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.row_test_transaction, null, false);
                holder = new ConvertView(convertView);
                convertView.setTag(holder);
            } else {
                holder = (ConvertView) convertView.getTag();
            }

            txtTestKode = holder.getTxtTestKode();
            txtTestName = holder.getTxtTestName();
            txtTestStatus = holder.getTxtTestStatus();


            new AsyncTask<String, Void, String>() {
                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                }

                @Override
                protected String doInBackground(String... params) {
                    try {
                        String url = "my_url";
                        WebRequestPost req = new WebRequestPost(url);


                        req.execute();

                        BufferedReader reader = new BufferedReader(new InputStreamReader(req.getResultStream()));
                        String result = reader.readLine();
                        reader.close();
                        req.closeStream();

                        return resu<
                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                    } catch (SQLiteConstraintException e) {
                        e.printStackTrace();
                    } catch (SQLiteException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    return null;
                }

                @Override
                protected void onPostExecute(String results) {
                    super.onPostExecute(results);
                    if (results != null) {
                        if (Integer.parseInt(results) > 0) {
                            holder.getLayoutBadge().setVisibility(View.VISIBLE);
                        }
                    }
                }
            }.execute();

            return convertView;
        }


    }
  

и:

 public static class ConvertView {
        private View row;

        private RelativeLayout layoutBadge;

        public ConvertView(View row) {
            this.row = row;
        }


        public RelativeLayout getLayoutBadge() {
            if (layoutBadge == null) {
                layoutBadge = (RelativeLayout) row.findViewById(R.id.layoutBadge);
            }
            return layoutBadge;
        }


    }
  

Спасибо

Комментарии:

1. проверьте механизм утилизации listview

2. Также любопытно. Что такое WebRequestPost ??

Ответ №1:

вы не должны выполнять такие задачи в адаптере. происходит то, что данные извлекаются асинхронно и могут быть доступны в любое время позже (изменение данных случайным образом). адаптер продолжает загружать другие данные строк и не ждет завершения каждой задачи rows, потому что вы делаете это асинхронно.

лучше всего предоставлять данные перед созданием адаптера и отправлять данные в виде списка адаптеру в качестве аргумента конструктора.