0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 18
1

Заполнение ListView в AsyncTask

03.04.2015, 19:07. Показов 2192. Ответов 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;
            }
 
        }
 
    }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2015, 19:07
Ответы с готовыми решениями:

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

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

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

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

3
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
03.04.2015, 22:19 2
2-й параметр AsyncTask у вас void, значит передавать в onProgressUpdate ничего нельзя.
onProgressUpdate(); должно быть publishProgress(Progress…)
adapter.notifyDataSetChanged() в onProgressUpdate работать не может.
1
0 / 0 / 0
Регистрация: 09.06.2014
Сообщений: 18
04.04.2015, 15:18  [ТС] 3
А если сделать второй аргумент не Void, а, к примеру, Bitmap?
0
912 / 560 / 88
Регистрация: 13.02.2014
Сообщений: 2,081
04.04.2015, 18:16 4
Лучший ответ Сообщение было отмечено Radeon как решение

Решение

Нет, второй параметр обычно делают integer, т.к. это прогрессбар, никаких картинок.
Заполняйте листвью в onPostExecute().
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2015, 18:16
Помогаю со студенческими работами здесь

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

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

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

Заполнение ListView данными из ArrayList
Привет! Помогите решить проблему. Есть класс в котором настроен ArrayList: public class Colors { ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru