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

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

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

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

04.05.2015, 19:28. Просмотров 897. Ответов 22
Метки нет (Все метки)

В классе, который расшияет AsyncTask, занружаю данные из JSON и сохраняю в бд.
При первом запуске апликации, список не выдаёт какого либо результата, так как лист выводиться ещё до того, как в базе данных есть какие либо записи.
Имею фрагмент, который работает с фрагментмо и его адаптером.
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
public class EventListFragment extends ListFragment {
    
    public static final String TAG = "EventListFragment";
 
    // Переменные
    ArrayList<Event> list;
    EventAdapter eventAdapter;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        Log.i(TAG, "onCreate");
        dbHelper = new DatabaseHelper(getActivity());
        try {
            dbHelper.open();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
            
        list = dbHelper.getEvents();
        //System.out.println("List: " + list);
        eventAdapter = new EventAdapter(list);
        setListAdapter(eventAdapter);
        eventAdapter.setNotifyOnChange(true);
        
        //System.out.println("eventAdapter: " + eventAdapter);
        dbHelper.close();
        
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.i(TAG, "onCreateView");
        View view = inflater.inflate(R.layout.fragment_event_list, container, false);
        
        //swipeRefreshLayout = (SwipeRefreshLayout)view.findViewById(R.id.swiperefresh);
        
        listView = (ListView)view.findViewById(android.R.id.list);
        //listView = getListView();
        
        listView.setClickable(true);
        listView.setItemsCanFocus(true);
        
 
        
        return view;
        
    }
    
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Log.i(TAG, "onListItemClick");
        // На клике ухожу на фрагмент с полнйо информацией о кликнутом элементе
        
        
    }
            
    public void onRefreshComplete() {
        Log.i(TAG, "onRefreshComplete");
        
        swipeRefreshLayout.setRefreshing(false);
    }
 
    public class EventAdapter extends ArrayAdapter<Event> {
        
        public EventAdapter(ArrayList<Event> e) {
            super(getActivity(), android.R.layout.simple_list_item_1, e);
        }
        
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Log.i(TAG, "getView");
            if(convertView == null) {
                convertView = getActivity().getLayoutInflater().inflate(R.layout.event_list_item, null);
            }
            //Подаю данные объекта в элементы layout
            
            return convertView;
        }
        
    }
    
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.main, menu);
    }
    
}
Вот Класс AsyncTask'a
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
123
124
125
126
127
128
public class JsonTask extends AsyncTask<String, Void, String> {
 
    private static final String TAG = "JsonTask";
    private static final String site = "название сайта";
    private static final String url = site + "/json.php";
    Context context;
    String jsonResult;
    DatabaseHelper dbHelper;
    ArrayList<Event> eventList;
    Event event;
 
    public static void accessWebService() {
        JsonTask task = new JsonTask();
        // passes values for the urls string array
        task.execute(new String[] { url });
    }
 
    public void loadJSON() {
 
        eventList = new ArrayList<Event>();
        Log.i(TAG, "loadJSON");      
        try {
            JSONObject jsonResponse = new JSONObject(jsonResult);
            JSONArray jsonMainNode = jsonResponse.optJSONArray("event");
                for (int i = 0; i < jsonMainNode.length(); i++) {
                JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
                // Беру мне нужные элементы с джейсона            
                String event_image = jsonChildNode.optString("image");
                String imgurl = site + event_image;
                System.out.println("loadJSON imgurl: " + imgurl);
 
                event = new Event();
 
                event.image = getPicture(imgurl);
                System.out.println("getPicture(imgurl): " + getPicture(imgurl));
                System.out.println("event.image: " + event.image);
                // System.out.println говорят, что здесь получаю null 
                // Подаю в объект
                eventList.add(event);
 
            }
 
        } catch (JSONException e) {
            Toast.makeText(context, R.string.error + e.toString(),
                    Toast.LENGTH_SHORT).show();
        }
 
    }
 
    public void loadDatabase() {
        Log.i(TAG, "loadDatabase");
        for (int i = 0; i < eventList.size(); i++) {
 
            dbHelper = new DatabaseHelper(context);
 
            dbHelper.loadEvent(new Event(
                 //Записываем всё в базу данных
            ));
        }
    }
 
    private StringBuilder inputStreamToString(InputStream is) {
        String rLine = "";
        StringBuilder answer = new StringBuilder();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
 
        try {
            while ((rLine = rd.readLine()) != null) {
                answer.append(rLine);
            }
        }
 
        catch (IOException e) {
            Toast.makeText(context,
                    R.string.error + e.toString(), Toast.LENGTH_LONG).show();
        }
        return answer;
    }
    
    // Метод где случается данная проблема
    public byte[] getPicture(String url){
        Log.i(TAG, "getPicture");
        try {
            URL imageUrl = new URL(url);
            URLConnection ucon = imageUrl.openConnection();
 
            InputStream is = ucon.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
 
            ByteArrayBuffer baf = new ByteArrayBuffer(500);
            int current = 0;
            while ((current = bis.read()) != -1) {
                    baf.append((byte) current);
            }
            return baf.toByteArray();
        } catch (Exception e) {
            Log.d("ImageManager", "Error: " + e.toString());
        }
        return null;
    }
 
    @Override
    protected String doInBackground(String... params) {
        Log.i(TAG, "doInBackground");
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(params[0]);
        try {
            HttpResponse response = httpclient.execute(httppost);
            jsonResult = inputStreamToString(
                    response.getEntity().getContent()).toString();
        }
 
        catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        loadDatabase();
        return null;
    }
    
   @Override
    protected void onPostExecute(String result) {
        Log.i(TAG, "onPostExecute");
 
    }
 
}
Можно ли сделать, что-бы данные в список загружались динамично, или после того, как база заполниться..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2015, 19:28     Загрузка ListView после AsyncTask
Посмотрите здесь:

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

Заполнение ListView в AsyncTask - Программирование Android
Нужно заполнить ListView картинками, которые скачиваются в AsyncTask с помощью Picasso. Картинки скачиваются нормально, ArrayList и...

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

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

Загрузка информации через AsyncTask и возврат ее в mainactivity - Программирование Android
Здравствуйте. Задача вроде проста, а ничего не получается) мне необходим класс, который по указанной ссылке будет загружать json и...

AsyncTask не выполняет код после завершения - Программирование Android
При окончании работы doInBackground не вызывается onPostExecute класс ParseTask: public class ParseTask extends AsyncTask&lt;String,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
edogaafx
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 11:45  [ТС]     Загрузка ListView после AsyncTask #2
Подыму тему.
НЕ знаю, как правильно сделать, что-бы лист фрагмент отображался только тогда, когда AsyncTask сделает своё дело..
Фрагмент списка уже формируется при запуске апликации, так как MainActivity кго создает.
А данные в скисок загружаются уже после. По-этому получается пустой экран.
Подскажите, как решить данную пролему...
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
22.05.2015, 12:58     Загрузка ListView после AsyncTask #3
Цитата Сообщение от edogaafx Посмотреть сообщение
НЕ знаю, как правильно сделать, что-бы лист фрагмент отображался только тогда, когда AsyncTask сделает своё дело.
Цитата Сообщение от edogaafx Посмотреть сообщение
данные в скисок загружаются уже после. По-этому получается пустой экран.
Эти предложения не противоречат друг другу? Раз у вас данные появляются после их загрузки, а до этого пустой экран - это и есть "что-бы лист фрагмент отображался только тогда, когда AsyncTask сделает своё дело", или я чего-то не понимаю?
edogaafx
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 13:02  [ТС]     Загрузка ListView после AsyncTask #4
Ну, первый пост был 4 числа.. оживил сегодян пост. Вот может быть что-то напортачил. Извиняюсь.
В общем,
У меня МэйнАктивити делает EventListFragment, а все задачи АсюнкТаска завершается уже после.. по-этосу список и выводится пустым..
Понимаю, что надо что-то делать в onPostExecute, но не знаю как правильно.
По-этому прошу совета, может с примером, если возможно,
как сделать, что-бы при запуске апликации, фрагмент списка выводился когда АсюнкТаск завершит все свои дела..
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 1
22.05.2015, 13:05     Загрузка ListView после AsyncTask #5
Цитата Сообщение от edogaafx Посмотреть сообщение
Понимаю, что надо что-то делать в onPostExecute
adapter.notifyDataSetChanged();
edogaafx
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 13:06  [ТС]     Загрузка ListView после AsyncTask #6
Но adapter ведь в совсем другом классе..
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
22.05.2015, 13:07     Загрузка ListView после AsyncTask #7
Цитата Сообщение от edogaafx Посмотреть сообщение
Но adapter ведь в совсем другом классе..
И что?
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 1
22.05.2015, 13:08     Загрузка ListView после AsyncTask #8
ссылку на него в конструктор своего асинктаска передай, как вариант
edogaafx
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 13:15  [ТС]     Загрузка ListView после AsyncTask #9
eventAdapter.notifyDataSetChanged();
Получаю NullPointException
Адаптер null
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 1
22.05.2015, 13:19     Загрузка ListView после AsyncTask #10
логики нет совсем?

если выдает такую ошибку - значит на момент вызова ссылка = null
значит ты либо не передал ссылку на объект либо вообще его не создал
edogaafx
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 13:32  [ТС]     Загрузка ListView после AsyncTask #11
Есть логика, но у меня всегда проблемы с павильнйо падачей переменных и тд и тп..
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 1
22.05.2015, 13:34     Загрузка ListView после AsyncTask #12
тогда код показывай, где создавал, где передавал, как принимал
edogaafx
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 13:38  [ТС]     Загрузка ListView после AsyncTask #13
Во фрагменте EventListFragment, есть класс EventAdapter:
Java
1
2
3
4
5
6
7
8
9
10
11
public class EventAdapter extends ArrayAdapter<Event> {
        
        public EventAdapter(ArrayList<Event> e) {
            super(getActivity(), android.R.layout.simple_list_item_1, e);
        }
        
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //всякие дела тут происходят..
        }   
    }
В классе JsonTask:
Подаю ссылку на eventAdapter
Java
1
EventAdapter eventAdapter;
onPostExecute в классе JsonTask:
Java
1
2
3
4
5
6
     protected void onPostExecute(String result) {
        super.onPostExecute(result);
        Log.i(TAG, "onPostExecute");
        System.out.println(eventAdapter);
        eventAdapter.notifyDataSetChanged();
    }
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 1
22.05.2015, 13:48     Загрузка ListView после AsyncTask #14
Цитата Сообщение от edogaafx Посмотреть сообщение
Подаю ссылку на eventAdapter
не подаешь, туда надо что-то присвоить - передать и присвоить

вариант мне не нравится, но можно например в метод accessWebService() где ты его там вызываешь, передать ссылку на созданный объект eventAdapter, а потом эту ссылку передать типа так JsonTask task = new JsonTask(eventAdapter);

естественно надо будет создать соответствующий конструктор (я не виноват что у тебя так странно создается асинктаск)
edogaafx
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 14:21  [ТС]     Загрузка ListView после AsyncTask #15
Паблито, вашим способом не получилось.
Во фрагменете попробовал eventAdapter сделать статичным.
Java
1
static EventAdapter eventAdapter;
А в JsonTask сделал так:
JSON
1
2
3
EventAdapter eventAdapter = EventListFragment.eventAdapter  ;
        System.out.println(eventAdapter);
        eventAdapter.notifyDataSetChanged();
Избавился от ошибки NullPointException, но список не появился..
Pablito
22.05.2015, 14:26
  #16

Не по теме:

Цитата Сообщение от edogaafx Посмотреть сообщение
не получилось
да кто-бы сомневался
Цитата Сообщение от edogaafx Посмотреть сообщение
А в JsonTask сделал так:
жесть

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

edogaafx
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 14:29  [ТС]     Загрузка ListView после AsyncTask #17
Потому, что параленльно пишу веб, эту апликацию и пишу диплом. . .
+ как говорил прежде, у меня всегда проблемы с подачей переменных и тд..
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
22.05.2015, 15:17     Загрузка ListView после AsyncTask #18
Цитата Сообщение от edogaafx Посмотреть сообщение
как говорил прежде, у меня всегда проблемы с подачей переменных и тд..
Как это? Вообще не представляю какие тут могут быть проблемы?
edogaafx
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 15:18  [ТС]     Загрузка ListView после AsyncTask #19
Spelcrawler, как видите, могут быть.. из-за не хватки опыта работы с ООП..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2015, 15:46     Загрузка ListView после AsyncTask
Еще ссылки по теме:

Динамическая загрузка в ListView - Программирование Android
Добрый день ув. Программисты. 3й день в безуспешных поисках. Точнее поиски успешны, но как прикрутить к своему проекту.... не...

Асинхронная загрузка элементов в listview - Программирование Android
Столкнулся с такой проблемой, что у меня есть listview, в который с сайта подгружается список из более чем ста позиций. Хотел бы сделать...

Загрузка изображений из сети в ListView - Программирование Android
Здравствуйте. Имеется файл в JSON формате. В нем дан массив объектов, каждый объект содержит поле &quot;name&quot; и поле &quot;image&quot;, в котором указан...

Загрузка Audio и Video в ListView из сети Интернет - Программирование Android
Как загружать Audio и Video в ListView из сети Интернет, с последующим воспроизведением?


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

Или воспользуйтесь поиском по форуму:
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
22.05.2015, 15:46     Загрузка ListView после AsyncTask #20
edogaafx, ну расскажите подробнее, может просто что-то не правильно понимаете. Я реально не могу понять что там может быть не так. Передаете в метод переменную - получаете ссылку на нее в методе. Вроде даже свернуть то некуда.
Yandex
Объявления
22.05.2015, 15:46     Загрузка ListView после AsyncTask
Ответ Создать тему
Опции темы

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