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

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

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

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

04.05.2015, 19:28. Просмотров 958. Ответов 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");
 
    }
 
}
Можно ли сделать, что-бы данные в список загружались динамично, или после того, как база заполниться..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2015, 19:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Загрузка ListView после AsyncTask (Программирование Android):

Загрузка текста и картинки в 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,...

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

если выдает такую ошибку - значит на момент вызова ссылка = null
значит ты либо не передал ссылку на объект либо вообще его не создал
0
edogaafx
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 13:32  [ТС] #11
Есть логика, но у меня всегда проблемы с павильнйо падачей переменных и тд и тп..
0
Pablito
2505 / 1989 / 619
Регистрация: 12.05.2014
Сообщений: 6,940
Завершенные тесты: 1
22.05.2015, 13:34 #12
тогда код показывай, где создавал, где передавал, как принимал
0
edogaafx
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 13:38  [ТС] #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();
    }
0
Pablito
2505 / 1989 / 619
Регистрация: 12.05.2014
Сообщений: 6,940
Завершенные тесты: 1
22.05.2015, 13:48 #14
Цитата Сообщение от edogaafx Посмотреть сообщение
Подаю ссылку на eventAdapter
не подаешь, туда надо что-то присвоить - передать и присвоить

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

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

ListView. После добавления кнопки перестал быть доступен сам ListView - Программирование Android
Кастомизировал ListView с помощью нескольких TextView. Но после того, как добавил ImageButton сам список стал недоступен для клика, а...

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

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

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


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

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

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