2012-03-06 57 views
2

我在ListView中遇到了一些嚴重的getView問題。問題是,我在每行都有CheckBoxes。我需要與他們合作 - ListView是TabHost的一部分,我需要記住哪個CheckBox被選中並在其他選項卡中使用它。在適配器中爲ListView查找位置的問題

但是,我也有一個「主複選框」,它檢查列表視圖中的所有複選框。沒什麼大不了的,但事情是,我無法找到我點擊的位置來更改ArrayList中CheckBox的狀態,在那裏我保留了CheckBox的所有狀態。每次我給每個View分配一個監聽器時,作爲參數的「int position」給出了一些奇怪的數字,絕對不是我需要的 - 我在適配器中的位置,我敢打賭它就像「現在屏幕上的位置......」

下面是代碼:

public View getView(int position, View convertView, ViewGroup parent) { 
     count = position; 
     View rowView = convertView; 
     SingleCarView sView = null; 

     if (rowView == null) { 
      LayoutInflater inflater = activity.getLayoutInflater(); 
      rowView = inflater.inflate(R.layout.activity_overview_listview_row, null); 
      sView = new SingleCarView(); 

      sView.cbx = (CheckBox)rowView.findViewById(R.id.overview_listview_chckbox); 
      sView.carName = (TextView)rowView.findViewById(R.id.overview_listview_label); 
      sView.state = (ImageView)rowView.findViewById(R.id.overview_listview_icon); 
      rowView.setTag(sView); 
     } else { 
      sView = (SingleCarView) rowView.getTag(); 
     } 
     // THE TROUBLE BEGINS HERE... 
     sView.cbx.setChecked(savedState.get(position)); 
     sView.cbx.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if(computerActionWithCheckBox) { 
        // nothing 
       } else { 
        if(allCars.isChecked()) { 
         savedState.set(count, isChecked); 
         userModifiedCheckBox = true; 
         allCars.setChecked(false); 

         adapter.notifyDataSetChanged(); 
        } else { 
         savedState.set(count, isChecked); 
        } 
       } 
      } 
     }); 
     sView.carName.setText(objects.get(position)); 
     switch(DataLoaderBeta.par.carState.get(position)){ 
     case 1: 
      sView.state.setImageResource(R.drawable.ic_moving); 
      break; 
     case 2: 
      sView.state.setImageResource(R.drawable.ic_out_of_signal); 
      break; 
     case 0: 
      sView.state.setImageResource(R.drawable.ic_parked); 
      break; 
     } 
     return rowView; 
    } 

非常感謝所有的答案! :-)

回答

4

getView()方法設置爲您的CheckBox標籤和整數,表示你從getView()方法得到的位置:

sView.cbx.setTag(new Integer(position)); 
OnCheckedChangeListener你被點擊該複選框,然後

buttonView參數,並從這個鍵獲取代碼getTag()並使用該號碼的位置在savedState

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      Integer realPosition = (Integer) buttonView.getTag(); //realPosition will be the real position you get in the getView() method 
//other stuff here 
+0

輝煌,作品p erfectly。非常感謝你! – Michal 2012-03-06 13:11:45