С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
KTOIA
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
1

Обновление данных в ArrayAdapter

10.04.2013, 12:05. Просмотров 2042. Ответов 13
Метки нет (Все метки)

Добрый день.
Есть созданный ArrayAdapter. Он добавляется в 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
private class ParseSite extends AsyncTask<String, Void, List<Vacancy>> {
        
        protected List<Vacancy> doInBackground(String... arg) {
          List<Vacancy> output = new ArrayList<Vacancy>();
          try{
            HtmlHelper hh = new HtmlHelper(new URL(arg[0]),
                    getApplicationContext());
            output = hh.getTable();         
          }
          catch(Exception e){
            e.printStackTrace();
          };
        return output;
        }
        
        protected void onPostExecute(List<Vacancy>output){
            super.onPostExecute(output);            
            output.remove(0);           
            if (backUp == null){
                backUp = new ArrayList<Vacancy>(output);
            } else{
                backUp.addAll(output);
            }
 
            try{
                if (adapter == null){
                adapter = new InteractiveArrayAdapter(MainActivity.this, backUp);
                } else {
                    adapter.addAll(backUp);
                }
                adapter.notifyDataSetChanged();
                listview.setAdapter(adapter);
                listview.setOnScrollListener(new OnScrollListener(){
 
                    @Override
                    public void onScroll(AbsListView view,
                            int firstVisibleItem, int visibleItemCount,
                            int totalItemCount) {
                        if (view.getAdapter() != null && 
                                (firstVisibleItem + visibleItemCount >= totalItemCount) &&
                                (totalItemCount != 0 )){
                            
                            adapter.clear();
                            addInfo();
                        }
                        
                    }
 
                    @Override
                    public void onScrollStateChanged(AbsListView view,
                            int scrollState) {
                        // TODO Auto-generated method stub
                        
                    }
                    
                });
                
            } catch(Exception e){
                
            }
            dialog.dismiss();   
        }
    }
добавление:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
private void addInfo(){
        try{
            dialog  = ProgressDialog.show(MainActivity.this, 
                    "Working...", "request to server", true, false);
            parser = new ParseSite();
            parser.execute(url + Integer.toString(page++));
                        
        } catch (Exception e){
            Toast toast = Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG);
            toast.show();
        }
        adapter.notifyDataSetChanged();
    }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2013, 12:05
Ответы с готовыми решениями:

Выкидывает NullPointerException при заполнении данных через ArrayAdapter
Заполняю данные из массива Food.foods с помощью ArrayAdapter в ListView макета...

ACTION_SEND в ArrayAdapter
Ребят,вопрос такой, есть GridView с картинками, к нему отдельным классом...

Собственный ArrayAdapter
Доброго времени суток. Пытаюсь написать собственный адаптер для строкового...

ArrayAdapter и много заморочек
Сам ArrayAdapter String data = new String{&quot;Текст 1&quot;,&quot;Текст 2&quot;}; ...

Отличия в работе ArrayAdapter
Что то не понятное с ArrayAdapter на Android 2.3, У меня есть EditText в...

13
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
10.04.2013, 12:55 2
backUp.addAll(newData);
adapter.notifyDataSetChanged();
0
KTOIA
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
10.04.2013, 14:10  [ТС] 3
Попробовал, то же самое. Посмотрел в дебаге, содержимое backUp, обнуляется, похоже что дело в в нем. Объявляю так:
Java
1
2
private List <Vacancy> backUp = new 
            ArrayList<Vacancy>();
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
10.04.2013, 14:13 4
ну ищите где он у вас обнуляется.
0
KTOIA
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
10.04.2013, 15:23  [ТС] 5
Обнуляется когда делаю adapter.clear(); в onScroll, похоже из за ссылки. А если убрать - происходит зацыкливание

Добавлено через 1 час 0 минут
не подскажите как этого избежать?)
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
10.04.2013, 15:29 6
нужно разбираться с кодом, не совсем понимаю где оно у вас происходит.
0
KTOIA
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
10.04.2013, 15:30  [ТС] 7
в слушателе скролла
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
listview.setOnScrollListener(new OnScrollListener(){
 
                    @Override
                    public void onScroll(AbsListView view,
                            int firstVisibleItem, int visibleItemCount,
                            int totalItemCount) {
                        if (view.getAdapter() != null && 
                                (firstVisibleItem + visibleItemCount >= totalItemCount) &&
                                (totalItemCount != 0 )){
                            
                            adapter.clear();
                            addInfo();
                        }
                        
                    }
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
10.04.2013, 15:35 8
выложите проект.
0
KTOIA
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
10.04.2013, 15:43  [ТС] 9
http://ubuntuone.com/4H0S9UGmW5NU7bfXNIYwY2
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
11.04.2013, 20:56 10
не было времени посмотреть проект, но возможно вам нужно добавить проверку не идет ли загрузка в данный момент прежде чем вызывать новую.

Добавлено через 16 минут
Цитата Сообщение от KTOIA Посмотреть сообщение
if (adapter == null){
* * * * * * * * adapter = new InteractiveArrayAdapter(MainActivity.this, backUp);
* * * * * * * * } else {
* * * * * * * * * * adapter.addAll(backUp);
* * * * * * * * }
* * * * * * * * adapter.notifyDataSetChanged();
* * * * * * * * listview.setAdapter(adapter);
* * * * * * * * listview.setOnScrollListener(new OnScrollListener(){
@Override
* * * * * * * * * * public void onScroll(AbsListView view,
* * * * * * * * * * * * * * int firstVisibleItem, int visibleItemCount,
* * * * * * * * * * * * * * int totalItemCount) {
* * * * * * * * * * * * if (view.getAdapter() != null &&
* * * * * * * * * * * * * * * * (firstVisibleItem + visibleItemCount >= totalItemCount) &&
* * * * * * * * * * * * * * * * (totalItemCount != 0 )){
adapter.clear();
* * * * * * * * * * * * * * addInfo();
* * * * * * * * * * * * }
}
@Override
* * * * * * * * * * public void onScrollStateChanged(AbsListView view,
* * * * * * * * * * * * * * int scrollState) {
* * * * * * * * * * * * // TODO Auto-generated method stub
}
});
почему этот код в AsyncTask'e?
1
KTOIA
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
12.04.2013, 08:15  [ТС] 11
ну как, это же обновление интерфейса, насколько я читал, его обновление и нужно делать через AsyncTask.

не идет ли загрузка данных - если это про наполнение, то не идет 100%, т.к. процесс обновления выполняется в onPostExecute, т.е. после загрузки данных

кста, спасибо, что в моем коде не поленились порыться

Добавлено через 14 минут
Зато разобрался из за чего зацикливание - если не очистить adapter перед вызовом обновления UI, который будет происходить асинхронно , то в это время еще несколько раз сработает условие, что достигнут предел скролла и еще несколько потоков запустятся для загрузки инфы.
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
12.04.2013, 11:14 12
Цитата Сообщение от KTOIA Посмотреть сообщение
Зато разобрался из за чего зацикливание - если не очистить adapter перед вызовом обновления UI, который будет происходить асинхронно , то в это время еще несколько раз сработает условие, что достигнут предел скролла и еще несколько потоков запустятся для загрузки инфы.
просто проверяйте не происходит ли обновление прежде чем запускать новое.


Цитата Сообщение от KTOIA Посмотреть сообщение
ну как, это же обновление интерфейса,
нет, это создание адаптера и лысынера.


Цитата Сообщение от KTOIA Посмотреть сообщение
насколько я читал, его обновление и нужно делать через AsyncTask.
просто нужно делать в UI потоке.
0
KTOIA
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
12.04.2013, 11:49  [ТС] 13
Цитата Сообщение от V0v1k Посмотреть сообщение
нет, это создание адаптера и лысынера.
ну да вначале создаем, а потом обновляем:

Java
1
listview.setAdapter(adapter);
и это все делается после того как AsyncTask закончил работать и мы точно знаем что инфа полная, я не не очень представляю как об этом узнать в UI

Добавлено через 5 минут
а может быть это из за конструктора в InteractiveArrayAdapter

Java
1
2
3
4
5
public InteractiveArrayAdapter(Activity context, List<Vacancy> jobs){
        super(context, R.layout.adaptor, jobs);
        this.context = context;
        this.jobs = jobs;
    }
я перегрузил там же:
Java
1
2
3
4
5
6
7
8
    @Override
    public void clear(){
        this.jobs.clear();
    }
    
    public void addAll(Collection<? extends Vacancy> jobs) {
        this.jobs.addAll(jobs);     
    }
но тоже не помогло
0
V0v1k
12.04.2013, 12:40     Обновление данных в ArrayAdapter
  #14
0
12.04.2013, 12:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2013, 12:40
Привет! Вот еще темы с ответами:

Привязка класса к ArrayAdapter
Добрый день. Есть класс, содержащий опросы private static class Polls { ...

Как правильно настроить ArrayAdapter?
Создаю своё первое приложение, потому вопрос новичка. Статья, которой я...

Кастомный ArrayAdapter для Spinner
Создал свой адаптер. Привязал его к списку Spinner. Получил идентификатор...


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

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

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