2010-06-29 6 views
1

사용자 지정된 ArrayAdapter를 사용하여 listview를 보유하고 있습니다. 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은 도움이

편집 : 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 사용하는 경우에도 (항목) 나는

답변

0

그래, 문제는 스레드가 없어도 GUI 스레드가 GUI 스레드를 업데이트 할 수 있다는 점입니다. 그래서 내가 한 것은 onCreate 이벤트에서 핸들러를 선언하는 것이 었습니다. 내 public void update(java.util.Observable arg0, Object arg1)

에서

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

및 나는

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

그게 전부 넣어! 희망이 사람이 편리하게 제공됩니다.

0

를 다시로드 할 다른 곳을 눌러야 GUI가 업데이트되어 있어야합니다.

만약 의지, 당신은 add(), insert(), 또는 remove()를 통해 ArrayAdapter의 데이터를 변경하는 경우. 다른 방법으로 데이터를 변경하면 ArrayAdapter은 변경 사항을 알 수 없습니다.

+0

심지어 arrayadapter.add (Item)는 변경 사항에 응답하기 위해 아무 버튼이나 눌러야합니다. – Raul

+0

@ 라울 : 아니에요. http://github.com/commonsguy/cw-android/tree/master/Threads/Asyncer/ 및 http://github.com/commonsguy/cw-andtutorials/tree/master/04-ListView/ – CommonsWare

+0

추측 에뮬레이터 그러면 작동하지 않습니다. 나는 우분투를 며칠 안에 시험해 보겠다. – Raul

관련 문제