ListView不会更新

时间:2010-06-29 09:38:26

标签: android android-emulator

我有一个带有自定义ArrayAdapter的列表视图。当ArrayAdapter中的更改时,gui应该更新。但是,当它应该更新时,除非你按下模拟器上的一个键,否则它不会被更新。除非我单击模拟器上的任意按钮,否则可点击的行不可点击。 列表视图的基础数据在其他地方更改,然后通知观察者(在这种情况下为listview)

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

按钮上的魔力触摸后,数据会正确显示。但为什么? 有什么想法吗? 当我检查ArrayAdapter的items-reference时,它会显示更新的值,但gui不会。 Plz帮助

编辑:

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 :(得分:0)

  

当ArrayAdapter中有。时   改变了gui应该更新。

如果愿意,如果您通过ArrayAdapteradd()insert()更改了remove()的数据。如果您以其他方式更改数据,ArrayAdapter将无法了解更改。

答案 1 :(得分:0)

好的,所以事情是没有线程,但gui线程可以更新gui线程。 所以我所做的是在onCreate事件中声明一个Handler。

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);

多数民众赞成!希望这个对某人来说很方便。