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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
KTOIA
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
#1

Обновление данных в ArrayAdapter - Программирование Android

10.04.2013, 12:05. Просмотров 1710. Ответов 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();
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2013, 12:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обновление данных в ArrayAdapter (Программирование Android):

Выкидывает NullPointerException при заполнении данных через ArrayAdapter - Программирование Android
Заполняю данные из массива Food.foods с помощью ArrayAdapter в ListView макета activity_food_category.xml. При заполнении выкидывает ошибку...

ACTION_SEND в ArrayAdapter - Программирование Android
Ребят,вопрос такой, есть GridView с картинками, к нему отдельным классом подключен Adapter. Необходимо по клику картинки делать ACTON_SEND....

Собственный ArrayAdapter - Программирование Android
Доброго времени суток. Пытаюсь написать собственный адаптер для строкового типа: titles = new ArrayList&lt;String&gt;(messages.size());...

Отличия в работе ArrayAdapter - Программирование Android
Что то не понятное с ArrayAdapter на Android 2.3, У меня есть EditText в списке, меняя значение одного, меняются все. На Android &gt;= 4.0 все...

ArrayAdapter и много заморочек - Программирование Android
Сам ArrayAdapter String data = new String{&quot;Текст 1&quot;,&quot;Текст 2&quot;}; ArrayAdapter&lt;String&gt; adapter = new ArrayAdapter&lt;&gt;(this, ...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
10.04.2013, 12:55 #2
backUp.addAll(newData);
adapter.notifyDataSetChanged();
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>();
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
10.04.2013, 14:13 #4
ну ищите где он у вас обнуляется.
KTOIA
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
10.04.2013, 15:23  [ТС] #5
Обнуляется когда делаю adapter.clear(); в onScroll, похоже из за ссылки. А если убрать - происходит зацыкливание

Добавлено через 1 час 0 минут
не подскажите как этого избежать?)
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
10.04.2013, 15:29 #6
нужно разбираться с кодом, не совсем понимаю где оно у вас происходит.
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();
                        }
                        
                    }
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
10.04.2013, 15:35 #8
выложите проект.
KTOIA
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
10.04.2013, 15:43  [ТС] #9
http://ubuntuone.com/4H0S9UGmW5NU7bfXNIYwY2
V0v1k
1158 / 982 / 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?
KTOIA
0 / 0 / 0
Регистрация: 10.04.2013
Сообщений: 7
12.04.2013, 08:15  [ТС] #11
ну как, это же обновление интерфейса, насколько я читал, его обновление и нужно делать через AsyncTask.

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

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

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


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


Цитата Сообщение от KTOIA Посмотреть сообщение
насколько я читал, его обновление и нужно делать через AsyncTask.
просто нужно делать в UI потоке.
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);     
    }
но тоже не помогло
V0v1k
12.04.2013, 12:40     Обновление данных в ArrayAdapter
  #14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2013, 12:40
Привет! Вот еще темы с ответами:

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

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

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

ArrayAdapter вылет на clear и add - Программирование Android
Приветствую! Вылет на clear. Если эту строку закоментить то вылет на add. В чем может быть проблема? import java.io.File; ...


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

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

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