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

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

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

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

04.05.2015, 19:28. Просмотров 936. Ответов 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
Pablito
22.05.2015, 14:26     Загрузка ListView после AsyncTask
  #16

Не по теме:

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

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

0
edogaafx
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 14:29  [ТС] #17
Потому, что параленльно пишу веб, эту апликацию и пишу диплом. . .
+ как говорил прежде, у меня всегда проблемы с подачей переменных и тд..
0
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
22.05.2015, 15:17 #18
Цитата Сообщение от edogaafx Посмотреть сообщение
как говорил прежде, у меня всегда проблемы с подачей переменных и тд..
Как это? Вообще не представляю какие тут могут быть проблемы?
0
edogaafx
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 15:18  [ТС] #19
Spelcrawler, как видите, могут быть.. из-за не хватки опыта работы с ООП..
0
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
22.05.2015, 15:46 #20
edogaafx, ну расскажите подробнее, может просто что-то не правильно понимаете. Я реально не могу понять что там может быть не так. Передаете в метод переменную - получаете ссылку на нее в методе. Вроде даже свернуть то некуда.
0
edogaafx
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 15:52  [ТС] #21
Spelcrawler, и мне так казалось.
Обьясню:
EventListFragment содержит внутренний класс EventAdapter, который обрабатывает список.
Java
1
public class EventAdapter extends ArrayAdapter<Event>
Есть отдельный класс JsonTask:
Java
1
public class JsonTask extends AsyncTask<String, Void, String>
В которым я беру данные с JSON и записываю в базу и тд и тп.
В результате, при запуске пустой экран, так как Фрагмент со списком уже отображен, но данные ещё в процессе записи.
По-этому, как подсказали, нужно сделать
Java
1
notifyDataSetChanged()
.
В начале класса JsonTask, где инициализирую переменные, даю ссылку на адптер:
Java
1
EventAdapter eventAdapter;
Далее в метоже onPostExecute стараюсь обновить список:
Java
1
eventAdapter.notifyDataSetChanged();
Получаю NullPointException.
0
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
22.05.2015, 15:54 #22
Ну видимо на момент передачи у вас адаптер = null, посмотрите внимательнее и передавайте объекты в методы только после инициализации.
0
edogaafx
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 42
22.05.2015, 15:58  [ТС] #23
В onPostExecute пробовал сделать так:
Java
1
eventAdapter = new EventAdapter(eventList);
Где, eventList это ArrayList<Event>.
Получаю такое:
No enclosing instance of type EventListFragment is accessible. Must qualify the allocation with an enclosing instance of type EventListFragment (e.g. x.new A() where x is an instance of EventListFragment).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2015, 15:58
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
23
Yandex
Объявления
22.05.2015, 15:58
Ответ Создать тему
Опции темы

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