2010-06-29 101 views
1

我有一个自定义的ArrayAdapter的列表视图。当ArrayAdapter改变了gui应该更新。但是,当它应该更新时,除非您在模拟器上按一个键,否则它不会。可点击的行不可点击,除非我点击了仿真器上的任意按钮。 为ListView底层数据被其他地方改变,然后通知ListView不会更新

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

数据在魔术触摸的按钮后适当地呈现的观察者(在这种情况下,列表视图)。但为什么? 有什么想法? 当我检查ArrayAdapter的项目 - 参考它显示更新的值,但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(项目),我必须按其他地方为它重新加载

回答

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

完蛋了!希望这个对于某个人来说很方便。

0

当在一个ArrayAdapter已 改变gui应该更新。

如果意志,如果你通过add()insert(),或remove()改变ArrayAdapter的数据。如果您以其他方式更改数据,ArrayAdapter将不知道有关更改。

+0

即使arrayadapter.add(Item)需要按任意按钮才能响应更改。 – Raul 2010-06-29 13:32:24

+0

@Raul:不,它没有。见http://github.com/commonsguy/cw-android/tree/master/Threads/Asyncer/和http://github.com/commonsguy/cw-andtutorials/tree/master/04-ListView/ – CommonsWare 2010-06-29 13:58:17

+0

猜猜我的模拟器然后不起作用。我会在几天内尝试Ubuntu的 – Raul 2010-06-30 06:34:58