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

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

Войти
Регистрация
Восстановить пароль
 
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 598
#1

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

20.01.2013, 04:20. Просмотров 954. Ответов 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? - Программирование Android
как listview правильно заполнить массивом сообщений из AynkTask??

Как пересоздать (изменить размер) двумерный массив при вызове, например, функции - C#
Как пересоздать (изменить размер) двумерный массив при вызове, например, функции? Создаю так: ... private int FoxField; ... ...

Работа с новым массивом - C++
Задача: Сформировать массив, в котором будут только элементы исходного массива, оканчивающиеся на цифру К. Помогите пожалуйста...

Как клики по компоненту записать в массив в виде координат точек - C#
Пытаюсь написать форму, но у меня никак не получается вот такой момент. В дерективе &quot;public partial class Form1 : Form&quot; я объявляю ...

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

Как при клики мышкой по TabControl1 вывести координаты клика мышки - Visual Basic .NET
Имеется процедура 'при нажатии на кнопку миши дает ее координаты Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As...

4
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
20.01.2013, 04:52 #2
adapter.notifyDataSetChanged()
1
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 598
20.01.2013, 04:57  [ТС] #3
Цитата Сообщение от V0v1k Посмотреть сообщение
adapter.notifyDataSetChanged()
Простите за нубский вопрос, но где вызывать это метод? В адаптере в событии onItemClickListener?
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
20.01.2013, 05:00 #4
да.
1
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 598
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
Привет! Вот еще темы с ответами:

Как сделать что бы поиск находил материал на сайте при клики клавишей ENTER ? - HTML, CSS
Как сделать что бы поиск находил материал на сайте при клике клавишей ENTER ? &lt;input class=&quot;otextarea&quot; style=&quot;border: 2px solid цвет...

Как сделать что бы поиск находил материал на сайте при клики клавишей ENTER ? - HTML, CSS
Как сделать что бы поиск находил материал на сайте при клике клавишей ENTER ? &lt;input class=&quot;otextarea&quot; style=&quot;border: 2px solid цвет...

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

Как вызвать функцию с новым аргументом при нажатии кнопки в Tkinter? - Python
Всем привет) Начал осваивать питон и столкнулся с такой вот темой, при запуске срабатывает команда на кнопке и функция сразу выполняется,...


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

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

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