ListView не будет обновляться - PullRequest
1 голос
/ 29 июня 2010

У меня есть список с настроенным ArrayAdapter. Когда в ArrayAdapter изменился, графический интерфейс должен обновляться. Однако, когда он должен обновиться, он не будет, если вы не нажмете клавишу на эмуляторе. Кликабельные строки также не активны, если я не нажал на произвольную кнопку в эмуляторе. Базовые данные для просмотра списка изменяются где-то еще и затем уведомляют наблюдателя (в этом случае просмотр списка)

public void update(java.util.Observable arg0, Object arg1) 
    {
        Log.e("Supposed","to update");
        ad.notifyDataSetChanged(); //Ad is the arrayadapter                         
    }

Данные отображаются правильно после волшебного прикосновения к кнопкам. Но почему? Какие-нибудь мысли? Когда я проверяю ссылку на ArrayAdapter, он показывает обновленные значения, но это не так. Пожалуйста, помогите

редактирование:

private class MustAdapter extends ArrayAdapter<Item> 
    {
        public MustAdapter(Context context, int textViewResourceId, ArrayList<Item> items)
        {
            super(context,textViewResourceId,items);
        }

        public View getView(int position, View convertView, ViewGroup parent) {
                View v = convertView;
                if (v == null) {
                    LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi.inflate(R.layout.row, null);
                }

                Item o = items.get(position);
                if (o != null) {

                        TextView tt = (TextView) v.findViewById(R.id.text1); 
                        TextView bt = (TextView) v.findViewById(R.id.text2);
                        ImageView iv= (ImageView) v.findViewById(R.id.img);
                        ImageView ib = (ImageView)v.findViewById(R.id.OnOffButt);
                        if (ib != null) {
                            ib.setTag(position);
                            if (((Ventilation)o).enabled ==0 ) {
                                ib.setImageResource(android.R.drawable.ic_input_delete);
                            }
                            else
                                ib.setImageResource(android.R.drawable.ic_input_add);
                            ib.setOnClickListener(new OnClickListener() {

                            public void onClick(View arg0) {
                                int index=((Integer)arg0.getTag()).intValue();
                                Ventilation v= (Ventilation)items.get(index);
                                v.enabled=v.enabled != 0 ? 0 : 1;
                                //ad.notifyDataSetChanged();
                                DU.toggle(v);


                            }
                        });
                        }

                        if (iv !=null){
                            iv.setImageResource(R.drawable.fan);
                        }
                        if (tt != null) {
                              tt.setText(""+((Ventilation)o).actual);                            }
                        if(bt != null){
                              bt.setText(""+((Ventilation)o).setPoint);
                        }
                }
                return v;
        }

Даже когда я использую arrayadapter.add (item), мне нужно нажать где-нибудь еще, чтобы перезагрузить

Ответы [ 2 ]

0 голосов
/ 30 июня 2010

Хорошо, дело в том, что ни один поток, кроме потока графического интерфейса, не может обновить поток графического интерфейса.Поэтому я объявил обработчик в событии onCreate.

h= new Handler(){
                @Override
                public void handleMessage(Message msg)
                {
                    switch (msg.what)
                    {
                    case 0:
                        ad.notifyDataSetChanged();
                    }
                }
            };

, а в моем public void update(java.util.Observable arg0, Object arg1)

я поставил

Message ms= new Message();
        ms.what=0;
        h.sendMessage(ms);

Вот и все!Надеюсь, это кому-нибудь пригодится.

0 голосов
/ 29 июня 2010

При изменении в ArrayAdapter графический интерфейс должен обновляться.

Если будет, если вы измените данные ArrayAdapter через add(), insert()или remove().Если вы измените данные другим способом, ArrayAdapter не будет знать об этом изменении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...