Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
1

Загрузка ListView после AsyncTask

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

Author24 — интернет-сервис помощи студентам
В классе, который расшияет 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.05.2015, 19:28
Ответы с готовыми решениями:

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

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

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

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

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

если выдает такую ошибку - значит на момент вызова ссылка = null
значит ты либо не передал ссылку на объект либо вообще его не создал
0
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 13:32  [ТС] 11
Есть логика, но у меня всегда проблемы с павильнйо падачей переменных и тд и тп..
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
22.05.2015, 13:34 12
тогда код показывай, где создавал, где передавал, как принимал
0
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
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
22.05.2015, 13:48 14
Цитата Сообщение от edogaafx Посмотреть сообщение
Подаю ссылку на eventAdapter
не подаешь, туда надо что-то присвоить - передать и присвоить

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

естественно надо будет создать соответствующий конструктор (я не виноват что у тебя так странно создается асинктаск)
0
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
Pablito
22.05.2015, 14:26
  #16

Не по теме:

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

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

0
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 14:29  [ТС] 17
Потому, что параленльно пишу веб, эту апликацию и пишу диплом. . .
+ как говорил прежде, у меня всегда проблемы с подачей переменных и тд..
0
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
22.05.2015, 15:17 18
Цитата Сообщение от edogaafx Посмотреть сообщение
как говорил прежде, у меня всегда проблемы с подачей переменных и тд..
Как это? Вообще не представляю какие тут могут быть проблемы?
0
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 15:18  [ТС] 19
Spelcrawler, как видите, могут быть.. из-за не хватки опыта работы с ООП..
0
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
22.05.2015, 15:46 20
edogaafx, ну расскажите подробнее, может просто что-то не правильно понимаете. Я реально не могу понять что там может быть не так. Передаете в метод переменную - получаете ссылку на нее в методе. Вроде даже свернуть то некуда.
0
22.05.2015, 15:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2015, 15:46
Помогаю со студенческими работами здесь

Порционная загрузка с AsyncTask и бесконечный скролл
Есть большой JSON с текстом и картинками. С помощью AsyncTask я гружу все данные, но возникла...

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

AsyncTask не выполняет код после завершения
При окончании работы doInBackground не вызывается onPostExecute класс ParseTask: public class...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru