Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Radeon
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 18
#1

Заполнение ListView в AsyncTask - Программирование Android

03.04.2015, 19:07. Просмотров 885. Ответов 3
Метки нет (Все метки)

Нужно заполнить ListView картинками, которые скачиваются в AsyncTask с помощью Picasso. Картинки скачиваются нормально, ArrayList и ArrayAdapter заполняются, но при adapter.notifyDataSetChanged(); в onProgressUpdate(); вылезает Exception - ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
В чём проблема и как лучше решить данную задачу? (Асинхронное заполнение listView картинками из интернета)

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
public static class PlaceholderFragment extends Fragment {
 
        private static final String ARG_SECTION_NUMBER = "section_number";
 
        private static final String JSON_PHOTO = "photo";
        private static final String JSON_TITLE = "title";
        private static final String JSON_DESCRIPTION = "description";
        private static final String JSON_HALL = "hall";
        private static final String JSON_PRICE = "price";
 
 
        /**
         * Returns a new instance of this fragment for the given section
         * number.
         */
        public static PlaceholderFragment newInstance(int sectionNumber) {
            PlaceholderFragment fragment = new PlaceholderFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
            fragment.setArguments(args);
            return fragment;
        }
 
        public PlaceholderFragment() {
        }
 
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_event_list, container, false);
            Context context = getActivity().getApplicationContext();
 
            TextView tvTitle = (TextView)rootView.findViewById(R.id.eventsListTitle);
 
            ListView listView = (ListView)rootView.findViewById(R.id.eventsListView);
            ArrayList<Bitmap> bitmaps = new ArrayList<Bitmap>();
            ArrayAdapter<Bitmap> adapter = new ArrayAdapter<Bitmap>(context, R.layout.list_item ,bitmaps);
            listView.setAdapter(adapter);
 
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            String startDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
            String params; //передаётся на сервер
 
            switch (getArguments().getInt(ARG_SECTION_NUMBER)) {
                case 1: //"на этой неделе". От сегодня до последнего дня недели
                    tvTitle.setText(R.string.eventsList_title_section1);
                    Calendar cal1 = Calendar.getInstance();
                    //Берём последний день нашей недели
                        //У американцев неделя начинается с воскресенья, поэтому сначала переходим на след. неделю, а потом берём её первый день
                    cal1.add(Calendar.WEEK_OF_YEAR, 1);
                    cal1.add(Calendar.DAY_OF_WEEK, -1*cal1.get(Calendar.DAY_OF_WEEK)+1); //Получаем воскресенье текущее.
                    String end_date = dateFormat.format(new Date(cal1.getTimeInMillis()));
                    params = "start_date="+startDate+"&end_date="+end_date;
                    (new AsyncFillListView(context, adapter,bitmaps)).execute(params);
                    break;
                case 2:
                    tvTitle.setText(R.string.eventsList_title_section2);
                    params = "start_date="+startDate;
                    //new AsyncFillListView(context, handler).execute(params);
                    break;
            }
 
 
            return rootView;
        }
 
 
 
        private class AsyncFillListView extends AsyncTask<String, Void, Void> {
 
            Context context;
            ArrayList<Bitmap> bitmaps;
            ArrayAdapter<Bitmap> adapter;
 
 
            public AsyncFillListView(Context context, ArrayAdapter<Bitmap> adapter, ArrayList<Bitmap> bitmaps) {
                super();
                this.context = context;
                this.bitmaps = bitmaps;
                this.adapter = adapter;
 
            }
 
            @Override
            protected void onProgressUpdate(Void... values) {
                super.onProgressUpdate(values);
                adapter.notifyDataSetChanged();
            }
 
            @Override
            protected Void doInBackground(String... params) {
 
                try {
                    //Скачивание JSON по url
                    URL url = new URL("http://heabe.besaba.com/getEvents.php?"+params[0]);
                    URLConnection urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.connect();
                    InputStream inputStream = urlConnection.getInputStream();
                    StringBuffer buffer = new StringBuffer();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                    String line;
                    while ((line = reader.readLine()) != null) {
                        buffer.append(line);
                    }
                    String stringJSON = buffer.toString();
                    //Приведение к jsonArray
                    JSONArray jsonArray = new JSONArray(stringJSON);
                    for(int i=0;i<jsonArray.length();i++) {
                        JSONObject jsonObject = jsonArray.getJSONObject(i);
                        Bitmap bitmap = Picasso.with(context).load(Uri.parse(jsonObject.getString(JSON_PHOTO))).get();
                        bitmaps.add(bitmap);
                        onProgressUpdate();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
 
        }
 
    }
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2015, 19:07     Заполнение ListView в AsyncTask
Посмотрите здесь:

Свой listview с AsyncTask - Программирование Android
Подскажите, что не так делаю. При запуске приложения listview просто не отображается. Переменные все прошелся дебагером, значения...

Загрузка ListView после AsyncTask - Программирование Android
В классе, который расшияет AsyncTask, занружаю данные из JSON и сохраняю в бд. При первом запуске апликации, список не выдаёт какого либо...

Как из AsyncTask Добавить элементы в ListView - Программирование Android
В общем сабж. Используя адаптер как сделать?

Загрузка текста и картинки в listView с AsyncTask - Программирование Android
Привет всем. Имеется файл в формате JSON на удалённом сервере. Мне нужно вывести текст из определённых узлов файла и картинки по указанным...

Заполнение ListView из БД - Программирование Android
Есть одна активити, в ней 2 текстовых поля и кнопка, отправляющая содержимое этих полей как строку в БД. Есть другая активити, которая...

Заполнение ListView из HashMap - Программирование Android
Добрый день. Столкнулся с некоторой проблемой при наполнении ListView с помощью HashMap. Проблема вот в чем, заполняю HashMap с помощью...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
03.04.2015, 22:19     Заполнение ListView в AsyncTask #2
2-й параметр AsyncTask у вас void, значит передавать в onProgressUpdate ничего нельзя.
onProgressUpdate(); должно быть publishProgress(Progress…)
adapter.notifyDataSetChanged() в onProgressUpdate работать не может.
Radeon
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 18
04.04.2015, 15:18  [ТС]     Заполнение ListView в AsyncTask #3
А если сделать второй аргумент не Void, а, к примеру, Bitmap?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2015, 18:16     Заполнение ListView в AsyncTask
Еще ссылки по теме:

Некорректное заполнение ListView - Программирование Android
Есть 2 фрагмента, в первом лист заполняемый с помощью TypedArray. Когда я перехожу по позиции листа и возвращаюсь назад, то лист...

Неверно отображается заполнение прогрессбара в элементах ListView - Программирование Android
Добрый день. Мне нужно создать ListView, в элементах которого отображается ProgressBar нестандартного цвета. В методе getView моего списка...

Exception в AsyncTask - Программирование Android
Доброго всем. Проблема вот в чем: периодически во время выполнения одного из потоков в AsyncTask вылетает следующее: 04-21...

AsyncTask тормозит - Программирование Android
Подскажите пожалуйста, делалю загрузку данных с сервера через asyncTask и возвращаются результат, а дальше делаю обработку этих данных во...

Работа с AsyncTask - Программирование Android
Попробовал использовать AsyncTask и возник вопрос. У меня есть несколько ф-й, которые парсят текстовые файлы и заполняют таблицы БД. ...

AsyncTask+CheckBox - Программирование Android
Здравствуйте, интересует вопрос нужно в функцию AsyncTask послать несколько строк, в зависимости какие Чекбоксы чекнуты. Ну например: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
04.04.2015, 18:16     Заполнение ListView в AsyncTask #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Нет, второй параметр обычно делают integer, т.к. это прогрессбар, никаких картинок.
Заполняйте листвью в onPostExecute().
Yandex
Объявления
04.04.2015, 18:16     Заполнение ListView в AsyncTask
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru