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

Не работает notifyDataSetChanged() - Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
04.12.2013, 08:39     Не работает notifyDataSetChanged() #1
Доброе Утро тем кто проснулся и тем кто уже подтягивается постучать по пластмассовому другу.

Вот код:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.third, container, false); 
        context = view.getContext();
        ls2 = (ListView) view.findViewById(R.id.listView);
        lvAdapter = new CustomAdapter(this.context, m_Devices);
        ls2.setAdapter(lvAdapter);
        m_Devices.clear();
        [B]new MyTask().execute();[/B]
        lvAdapter.notifyDataSetChanged();
 
        ls2.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                Device device = (Device) arg0.getAdapter().getItem(arg2);
                app= device.getDeviceName();
                device.getDeviceAddress();
                Log.d(TAG, app);             
            }
        });
    return view;
    }
А вот в этом коде заполняю данными:

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
public class MyTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... stri) {
            m_Devices.clear();
            Log.d(TAG, "Запущен MyTask");           
            url = "http://mysite.com/result.txt";
            sb = null;
            try {
                myurl = new URL(url);
                br = new BufferedReader(new InputStreamReader(myurl.openStream()));
                sb = new StringBuilder(100);
                while ((Str = br.readLine()) !=null) {
                    sb.append(Str+"\n");
                }
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // РАЗБИВАЕМ НА ВХОЖДЕНИЕ
            input = sb.toString();
            fileData = input.split("\n");
            for(int i=0; i<fileData.length; i++)
            {
                fileData2 = fileData[i].split(";");
                dev=Integer.parseInt(fileData2[2]);
               
               [B] device = new Device(fileData2[0],dev, dev%2,0, 100 + i);
                m_Devices.add(device);[/B]
            }
         [B]   Log.d(TAG, "Пытаемся запустить обновление");
            lvAdapter.notifyDataSetChanged();[/B]
[B]Log.d(TAG, "==================");[/B]
            return sb.toString();
 
        }
    }
Вообщем в логах появляется: Пытаемся запустить обновление. Затем программа вылетает. Это сообщение не появляется: ==================. Следовательно проблема с lvAdapter.notifyDataSetChanged(). А что именно не могу понять.

Объясните пожалуйста.
Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2013, 08:39     Не работает notifyDataSetChanged()
Посмотрите здесь:

Android RSS-читалка - работает на эмуляторе, не работает на реальном девайсе
Работает в Eclipce но не работает на телефоне Android
Пустой список после вызова adapter.notifyDataSetChanged Android
Стандартная функция delete в Eclipse работает а в AndroidStudio не работает Android
Android Socket.io (прослушивание события работает на Desktop и не работает на Android)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
verylazy
Заблокирован
04.12.2013, 11:15     Не работает notifyDataSetChanged() #2
Java
1
lvAdapter.notifyDataSetChanged();
что это за объект, как он может быть виден в MyTask ?
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
04.12.2013, 12:24  [ТС]     Не работает notifyDataSetChanged() #3
Цитата Сообщение от verylazy Посмотреть сообщение
Java
1
lvAdapter.notifyDataSetChanged();
что это за объект, как он может быть виден в MyTask ?
Через глобальную переменную:

Java
1
2
3
4
5
6
7
8
9
10
public class ThirdFragment extends Fragment {
public CustomAdapter lvAdapter;
@Override
    public void onCreate(Bundle savedInstanceState) {
...
}
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
}
а Вот сам Адаптер:

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
class CustomAdapterView extends LinearLayout {        
    public CustomAdapterView(Context context, Device device) 
    {
        super( context );
 
        setId(device.getDeviceID());        
        setOrientation(LinearLayout.HORIZONTAL);
        setPadding(0, 6, 0, 6); 
        LayoutParams Params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        Params.setMargins(6, 0, 6, 0);      
        ImageView ivLogo = new ImageView(context);      
        if (device.getDeviceType() == 0)
            ivLogo.setImageDrawable(context.getResources().getDrawable(R.drawable.off));
        else if (device.getDeviceType() == 1)
            ivLogo.setImageDrawable(context.getResources().getDrawable(R.drawable.on));     
        addView(ivLogo, Params);        
        Params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
        LinearLayout PanelV = new LinearLayout(context);
        PanelV.setOrientation(LinearLayout.VERTICAL);
        PanelV.setGravity(Gravity.BOTTOM);      
        TextView textName = new TextView( context );
        textName.setTextSize(16);
        textName.setTypeface(Typeface.DEFAULT, Typeface.BOLD);
        textName.setText( device.getDeviceName());
        PanelV.addView(textName);   
        TextView textAddress = new TextView( context );
        textAddress.setTextSize(13);
        textAddress.setText( device.getDeviceAddress());
        PanelV.addView(textAddress);        
        addView(PanelV, Params);
    }
}
 
 
public class CustomAdapter extends BaseAdapter  {
    public static final String LOG_TAG = "BI::CA";
    private Context context;
    private List<Device> deviceList;
 
    public CustomAdapter(Context context, List<Device> deviceList ) { 
        this.context = context;
        this.deviceList = deviceList;
    }
    public int getCount() {
        return deviceList.size();
    }
    public Object getItem(int position) {     
        return deviceList.get(position);
    }
    public long getItemId(int position) {  
        return position;
    }
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
        Device device = deviceList.get(position);
        View v = new CustomAdapterView(this.context, device );      
        return v;
    }  
 
}
Добавлено через 22 минуты
Цитата Сообщение от verylazy Посмотреть сообщение
...
Вот сам Device если он тут нужен:

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
public class Device {
           
        private String m_szDeviceName;
        private String m_szDeviceAddress;
        private int m_nDeviceType;
        private int m_nDeviceStatus;
        private int m_nDeviceID;
    private Object make;
 
    public Device( String deviceName, String deviceAddress, int deviceType, int deviceStatus, int deviceID ) {
            this.m_szDeviceName = deviceName;
            this.m_szDeviceAddress = deviceAddress;
            this.m_nDeviceType = deviceType;
            this.m_nDeviceStatus = deviceStatus;
            this.m_nDeviceID = deviceID;
          }
 
 
        public String getDeviceName() { return m_szDeviceName; }
        public void setDeviceName(String deviceName) { this.m_szDeviceName = deviceName;}
        
        public String getDeviceAddress() {return m_szDeviceAddress;}
        public void setDeviceAddress(String deviceAddress) {this.m_szDeviceAddress = deviceAddress;}
        
        public int getDeviceType() { return m_nDeviceType; }
        public void setDeviceType(int deviceType) { this.m_nDeviceType = deviceType;}
        
        public int getDeviceStatus() { return m_nDeviceStatus; }
        public void setDeviceStatus(int deviceStatus) { this.m_nDeviceStatus = deviceStatus;}
        
        public int getDeviceID() { return m_nDeviceID; }
        public void setDeviceID(int deviceID) { this.m_nDeviceID = deviceID;}
 
 
}
Вот что выдаёт EroorLog:

Кликните здесь для просмотра всего текста


12-04 08:20:48.334 1730-1767/adr.app E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #4
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.java:239)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746)
at android.view.ViewRootImpl.focusableViewAvailable(ViewRootImpl.java:2588)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:608)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:608)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:608)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:608)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:608)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:608)
at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:608)
at android.view.View.setFlags(View.java:8412)
at android.view.View.setFocusableInTouchMode(View.java:5790)
at android.widget.AdapterView.checkFocus(AdapterView.java:717)
at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:812)
at android.widget.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:5958)
at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
at adr.app.ThirdFragment$MyTask.doInBackground(ThirdFragment.java:259)
at adr.app.ThirdFragment$MyTask.doInBackground(ThirdFragment.java:219)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
************at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
************at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
************at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
************at java.lang.Thread.run(Thread.java:856)
verylazy
Заблокирован
04.12.2013, 12:27     Не работает notifyDataSetChanged() #4
можно попробовать вынести lvAdapter.notifyDataSetChanged();
в метод onPostExecute();
cezer_ak
4 / 4 / 1
Регистрация: 14.02.2013
Сообщений: 232
04.12.2013, 12:35  [ТС]     Не работает notifyDataSetChanged() #5
Цитата Сообщение от verylazy Посмотреть сообщение
...
Сейчас попробую.

Добавлено через 6 минут
Цитата Сообщение от verylazy Посмотреть сообщение
...
Огромное спасибо! Блин два дня мучался, уже все перерыл, что мог и не мог. Просто огромнейшее спасибо!
Yandex
Объявления
04.12.2013, 12:35     Не работает notifyDataSetChanged()
Ответ Создать тему
Опции темы

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