2011-04-19 28 views
1

我正在使用我的自定義適配器。每行都有一個複選框和一個文本視圖。 但我有一個問題。列表中的項目數量多於屏幕上的數量。當我滾動瀏覽時,List中的複選框隨機獲取選中/取消選中。 android 2.3

因此,當我檢查屏幕上的任何複選框並向下滾動。自動取消選中。

當我再次向上滾動一些隨機複選框得到檢查。

我知道在getView()列表正在刷新一次又一次地方的問題。 但不知道解決方案。

我已經嘗試使用布爾數組來保持一個軌道。但是dnt知道如何正確地做到這一點。

cb.setOnCheckedChangeListener(new OnCheckedChangeListener(){ 
         @Override 
         public void onCheckedChanged(CompoundButton buttonView, 
           boolean isChecked) { 

           itemChecked[index]=isChecked; 
         } 
        }); 
        cb.setChecked(itemChecked[index]); 

你可以請張貼一些代碼片段並詳細解釋。我累了自去年2周搜索這個的...在此先感謝..使用getview settag(位置)()方法

回答

6
public View getChildView(final int groupPosition, 
      final int childPosition, boolean isLastChild, View convertView, 
      ViewGroup parent) { 
     final ViewHolder holder; 
     //if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = mInflater.inflate(
        R.layout.expandableinner_custom_row, null); 

      holder.textView = (TextView) convertView 
        .findViewById(R.id.textView); 
      holder.checkBox = (CheckBox) convertView 
        .findViewById(R.id.checkBox); 
      String str = getChild(groupPosition, childPosition).toString(); 
      holder.textView.setText(str); 
      Boolean[] boolArr = SMSActivity.maintaingState.get(String 
        .valueOf(groupPosition)); 
      Log.i("BOOLARRAYSIZE ", String.valueOf(boolArr.length)); 

      Log.i("Boolean", 
        String.valueOf(boolArr[childPosition] + "GrpPosition: " 
          + groupPosition + "ChildPosition: " 
          + childPosition)); 
      if (boolArr[childPosition]) { 
       holder.checkBox.setChecked(true); 
      } else { 
       holder.checkBox.setChecked(false); 
      } 

       holder.checkBox 
         .setOnCheckedChangeListener(new OnCheckedChangeListener() { 

          @Override 
          public void onCheckedChanged(
            CompoundButton buttonView, 
            boolean isChecked) { 
           // TODO Auto-generated method stub 

           Boolean[] boolArr = SMSActivity.maintaingState 
             .get(String.valueOf(groupPosition)); 
           boolArr[childPosition] = isChecked;// (object) 
           Log.i("grpPosition", 
             String.valueOf(childPosition)); 
           Log.i("childPosition", 
             String.valueOf(groupPosition)); 
           SMSActivity.maintaingState.remove(String 
             .valueOf(groupPosition)); 
           SMSActivity.maintaingState.put(
             String.valueOf(groupPosition), 
             boolArr); 

           Log.i("Boolean", String 
             .valueOf(boolArr[childPosition] 
               + " GrpPosition: " 
               + groupPosition 
               + "ChildPosition: " 
               + childPosition)); 

          } 
       }); 

      convertView.setTag(holder); 
     return convertView; 

    } 
+1

避免了「其他」的一部分在你的「如果(convertView == NULL)」,並使用靜態數組來保持檢查的項目 – SALMAN 2011-08-16 10:03:14

+0

感謝您的幫助的狀態..但我已經找到了解決辦法長時間回來.. – cooldeep 2011-08-16 11:17:07

+0

和那是什麼? – 2012-04-21 09:52:54

4

集中的每個複選框位置,同時單擊每個複選框獲得通過的位置(整數)buttonView.getTag()。我認爲下面的代碼將解決您的問題。

public View getView(int position, View convertView, ViewGroup parent) 
    { 
     holder=new ViewHolder(); 
     convertView=lInflater.inflate(R.layout.extraevents, null); 
     holder.txtTitle=(TextView)convertView.findViewById(R.id.eventtitle); 
     holder.txtLocation=(TextView)convertView.findViewById(R.id.eventLoc); 
     holder.ChkEachBox=(CheckBox)convertView.findViewById(R.id.CheckBoxSelected);    

     holder.ChkEachBox.setClickable(true);   
     holder.ChkEachBox.setFocusable(false); 
     holder.ChkEachBox.setTag(position); 

     holder.ChkEachBox.setOnCheckedChangeListener(this); 
     EventItems cart=eventList.get(position); 

     holder.txtTitle.setText(cart.title); 
     holder.txtLocation.setText(cart.location);   

     if(cart.selected==true) 
     { 
      holder.ChkEachBox.setChecked(true);    
     } 
     else 
     { 
      holder.ChkEachBox.setChecked(false); 
     }   

     return convertView; 
    } 

    public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) 
    {      
     EventItems cart=eventList.get((Integer)buttonView.getTag());        
     if(buttonView.isChecked()) 
     { 
      cart.selected = true;    
     } 
     else 
     {    
      cart.selected = false; 

     } 
    }  
+0

+1這工作像一個魅力,謝謝隊友! – Sajmon 2013-09-04 11:06:29