2012-08-23 52 views
1

我正在爲listview的每個Iten實現與listview的複選框。我得到的問題是當我單擊任何單個複選框時,其他未點擊的複選框也會隨機點擊。複選框與ListView無法正常工作

public View getView(int position, View convertView, ViewGroup parent) { 
      // TODO Auto-generated method stub 

      View vi = convertView; 
      final int as=position; 
      if (convertView == null) { // if it's not recycled, initialize some 
       // attributes 
       LayoutInflater inflater = (LayoutInflater) activity 
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       vi = inflater.inflate(R.layout.grid_item, null); 
       holder = new ViewHolder(); 

       holder.textheader = (TextView) vi.findViewById(R.id.item1); 
       holder.textcpu = (TextView) vi.findViewById(R.id.item2); 
       holder.text_modified_date = (TextView) vi.findViewById(R.id.item4); 
       holder.text_cpu = (TextView) vi.findViewById(R.id.item3); 
       holder.text_checkbox=(CheckBox)vi.findViewById(R.id.checkBox1); 
       vi.setTag(holder); 

       holder.text_checkbox.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         if (holder.text_checkbox.isClickable()) { 
          itemChecked.set(as, true); 
          packages=as; 
         } else if (!holder.text_checkbox.isClickable()) { 
          itemChecked.set(as, false); 
         } 
         String packag=app_package.get(as); 
         Log.d("package listttttttttt", packag); 
        } 
       }); 


      } else { 
       holder = (ViewHolder) vi.getTag(); 


      } 

回答

2

試試下面的代碼

public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 

     View vi = convertView; 
     final int as=position; 
     if (convertView == null) { // if it's not recycled, initialize some 
      // attributes 
      LayoutInflater inflater = (LayoutInflater) activity 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      vi = inflater.inflate(R.layout.grid_item, null); 
      holder = new ViewHolder(); 

      holder.textheader = (TextView) vi.findViewById(R.id.item1); 
      holder.textcpu = (TextView) vi.findViewById(R.id.item2); 
      holder.text_modified_date = (TextView) vi.findViewById(R.id.item4); 
      holder.text_cpu = (TextView) vi.findViewById(R.id.item3); 
      holder.text_checkbox=(CheckBox)vi.findViewById(R.id.checkBox1); 
      vi.setTag(holder); 

     } else { 
      holder = (ViewHolder) vi.getTag(); 
     }   


      holder.text_checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() 
      {   
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)  
       {         
       if(isChecked) 
       { 
         // do your stuff 
         itemChecked.set(as, true); 
         packages=as; 
       } 
       else 
       { 
         // do your stuff 
         itemChecked.set(as, false); 
       }  

     } 
    }); 

if(itemChecked.size() != 0 && itemChecked.get(position)) 
     holder.text_checkbox.setChecked(true); 
    else 
     holder.text_checkbox.setChecked(false); 
+0

不工作,其他一些複選框也被檢查 – user1522869

+0

我現在做了小的改變檢查...通過d way什麼itemChecked.set(as,true);呢? – Braj

+0

無法設置setOnCheckedChangeListener方法。 itenChecked.set是將標誌設置爲true,如果項目被選中並且位置爲 – user1522869

1

的問題是,你的getView()方法不能與意見妥善處理。您必須設置新視圖的狀態並更新回收視圖的狀態。另外你必須定義視圖的行爲。對於類似的問題,SO上有很多線程。我認爲this one可以幫助你(它包含工作代碼)。

你的代碼看起來應該像下面的骨架:

public View getView(int position, View convertView, ViewGroup parent) { 
    View vi = convertView; 
    final int as=position; 
    if (convertView == null) { // no view passed, create one 
     LayoutInflater inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     vi = inflater.inflate(R.layout.grid_item, null); 
     // Setup the View content 
     holder = new ViewHolder(); 
     holder.textheader = (TextView) vi.findViewById(R.id.item1); 
     holder.textcpu = (TextView) vi.findViewById(R.id.item2); 
     holder.text_modified_date = (TextView) vi.findViewById(R.id.item4); 
     holder.text_cpu = (TextView) vi.findViewById(R.id.item3); 
     holder.text_checkbox=(CheckBox)vi.findViewById(R.id.checkBox1); 
     // Do your checkbox initial setup here. 
     holder.text_checkbox.setChecked(getBooleanFromPosition(position)); 
     vi.setTag(holder); 
     // Setup the View behavior 
     holder.text_checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() 
     {   
       // Do your stuff here 
    }); 
    } else { 
     // Update your View state 
     holder = (ViewHolder) vi.getTag(); 
     holder.text_checkbox.setChecked(getBooleanFromPosition(position)); 
    }     

很明顯,你有你的複選框的狀態存儲在一些數據結構,比如一個布爾數組,爲了知道是否讀取數據結構選中/取消選中給定位置的複選框(即讀取訪問是getBooleanFromPosition應該執行的操作)。並且該數據結構應該在控制View行爲的部分進行更新。

0

的問題是,你不能在一個列表視圖一起與焦距能項目的工作,但有解決的辦法:

如果您使用的是XML佈局你的列表項,請將複選框焦點屬性設置爲false:

android:focusable="false" 

這應該會導致列表項也是可點擊的。

我希望這可以解決您的問題。請讓我知道它是怎麼回事。

+0

已經在我的XML中提到過 – user1522869

相關問題