Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 608
#1

При клики в BaseAdapter меняется массив строк, как пересоздать ListView с новым массивом? - Программирование Android

20.01.2013, 04:20. Просмотров 997. Ответов 4
Метки нет (Все метки)

Здравствуйте!

Имеется класс:
Кликните здесь для просмотра всего текста
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
package ru.contedevel.mathworker;
 
import java.util.ArrayList;
import ru.contedevel.mathworker.libs.Tree;
import ru.contedevel.mathworker.libs.TreeBuilder;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.TextView;
 
public class TreeAdapter extends BaseAdapter implements OnItemClickListener {
    //Context
    Context ctx;
    //Inflater
    LayoutInflater inflater;
    //Tree
    private Tree tree;
    //String arrays
    private ArrayList<String> list;
    
    //Constructor
    public TreeAdapter(Context context, String str) {
        ctx = context;
        inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        
        TreeBuilder tb = new TreeBuilder(str);
        tree = tb.getTree();
        
        //Initialization of list
        list = new ArrayList<String> ();
        list.add("<---");
        //Create the highest array
        if(!tree.isEmpty()) {
            for(int i = 0; i < tree.getChildren().size(); i++) {
                list.add(tree.getChildById(i).str);
            }
        }
    }
 
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }
 
    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return list.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View view = convertView;
        if(view == null) {
            view = inflater.inflate(R.layout.tester_list_item, parent, false);
        }
        
        TextView tv = (TextView) view.findViewById(R.id.item);
        tv.setText(list.get(position));
        return view;
    }
 
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
        // TODO Auto-generated method stub
        Tree tmp = this.tree;
        if(position == 0) {
            tmp = tmp.getParent();
        }
        else {
            tmp = this.tree.getChildById(position - 1);
        }
        list.clear();
        list.add("<---");
        //Create the highest array
        if(!tmp.isEmpty()) {
            for(int i = 0; i < tmp.getChildren().size(); i++) {
                list.add(tmp.getChildById(i).str);
            }
        }
    }
    
}

При клики в BaseAdapter меняется массив строк, как пересоздать ListView с новым массивом строк? То есть с новыми элементами из моего дерева...

Это код выдает ошибки:
Кликните здесь для просмотра всего текста
01-20 02:27:37.472: E/InputEventReceiver(1253): Exception dispatching input event.
01-20 02:27:37.472: E/MessageQueue-JNI(1253): Exception in MessageQueue callback: handleReceiveCallback
01-20 02:27:37.522: E/MessageQueue-JNI(1253): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131296261, class android.widget.ListView) with Adapter(class ru.contedevel.mathworker.TreeAdapter)]
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.widget.ListView.layoutChildren(ListView.java:1538)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3513)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.View.dispatchTouchEvent(View.java:7127)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2170)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1905)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1919)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1925)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1379)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.app.Activity.dispatchTouchEvent(Activity.java:2396)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1873)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.View.dispatchPointerEvent(View.java:7307)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3174)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3119)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4155)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4134)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4226)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.os.MessageQueue.nativePollOnce(Native Method)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.os.MessageQueue.next(MessageQueue.java:125)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.os.Looper.loop(Looper.java:124)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at android.app.ActivityThread.main(ActivityThread.java:4745)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at java.lang.reflect.Method.invokeNative(Native Method)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at java.lang.reflect.Method.invoke(Method.java:511)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-20 02:27:37.522: E/MessageQueue-JNI(1253): at dalvik.system.NativeStart.main(Native Method)


Я так понял, что ListView продолжает использовать старый массив, но исправить это не получается....Пытался обновить - то же самое... Как это правильно сделать или правильно пересоздать item-ы? Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2013, 04:20
Я подобрал для вас темы с готовыми решениями и ответами на вопрос При клики в BaseAdapter меняется массив строк, как пересоздать ListView с новым массивом? (Программирование Android):

Как заполнить ListView массивом сообщений из AynkTask?
как listview правильно заполнить массивом сообщений из AynkTask??

Как пересоздать (изменить размер) двумерный массив при вызове, например, функции
Как пересоздать (изменить размер) двумерный массив при вызове, например,...

Работа с новым массивом
Задача: Сформировать массив, в котором будут только элементы исходного массива,...

Пересоздать массив
Добрый вечер, интересует вопрос как пересоздать массив, приведу пример: bool...

Массив Обджектов инициализировать массивом строк
Я понимаю, что занимаюсь ерундой. Но насколько я понимаю. Object в java супер...

Как клики по компоненту записать в массив в виде координат точек
Пытаюсь написать форму, но у меня никак не получается вот такой момент. В...

4
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
20.01.2013, 04:52 #2
adapter.notifyDataSetChanged()
1
contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 608
20.01.2013, 04:57  [ТС] #3
Цитата Сообщение от V0v1k Посмотреть сообщение
adapter.notifyDataSetChanged()
Простите за нубский вопрос, но где вызывать это метод? В адаптере в событии onItemClickListener?
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
20.01.2013, 05:00 #4
да.
1
contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 608
20.01.2013, 05:09  [ТС] #5
Спасибо) Все работает)
0
20.01.2013, 05:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 05:09
Привет! Вот еще темы с решениями:

Android Studio: Как заполнить listView многомерным массивом или таблицей?
Здравствуйте, Я пока новичок в программировании Андроид. Пожалуйста не...

Как при клики мышкой по TabControl1 вывести координаты клика мышки
Имеется процедура 'при нажатии на кнопку миши дает ее координаты Private...

Как с jq сделать так, чтобы при клики на div, включался radio?
Как с jq сделать так, чтобы при клики на div, включался radio?

Как сделать что бы поиск находил материал на сайте при клики клавишей ENTER ?
Как сделать что бы поиск находил материал на сайте при клике клавишей ENTER ?...


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

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

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