2011-12-07 2 views
3

私はExpandableListViewsで簡単な質問があり、CheckBoxesを使用しています。私は以下の現在のコードを表示します。私は現在、各子行にチェックボックス付きのExpandableListViewを持っています。Android ExpandableListView CheckBoxクリックのみのチェックボックスを選択

これらのcheckboxesを選択することができますが、問題は私のExpandableListViewに多くの子供がいることです。問題は、チェックボックスをオンにすると、複数のチェックボックスが選択されていることを示します。したがって、最初の子チェックボックスをチェックすると、6番目または7番目の子も選択されていることが示されます。

package com.WebGems.MW3CustomClasses; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.CheckBox; 
import android.widget.ExpandableListView; 
import android.widget.ExpandableListView.OnChildClickListener; 
import android.widget.ImageView; 
import android.widget.SimpleExpandableListAdapter; 
import android.widget.TextView; 

public class PrimaryWeapon extends Activity { 
    ExpandableListView listPrimaryWeapon; 


    //Strike Package ArrayLists 

    ArrayList assaultPackage = new ArrayList(); 




    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.primary_weapon); 
     listPrimaryWeapon = (ExpandableListView)findViewById(R.id.listView1); 

     Bundle extras = getIntent().getExtras(); 
     String type = extras.getString("type"); 


     if(type.equals("assault")) { 
      showAssaultPackageList(); 
     } 


    } 
    private void showAssaultPackageList() { 
     // TODO Auto-generated method stub 

     assaultPackage.add("UAV"); 
     assaultPackage.add("CARE PACKAGE"); 
     assaultPackage.add("I.M.S."); 
     assaultPackage.add("PREDATOR MISSILE"); 
     assaultPackage.add("SENTRY GUN"); 
     assaultPackage.add("PRECISION AIRSTRIKE"); 
     assaultPackage.add("ATTACK HELICOPTER"); 
     assaultPackage.add("STRAFE RUN"); 
     assaultPackage.add("AH-6 OVERWATCH"); 
     assaultPackage.add("REAPER"); 
     assaultPackage.add("ASSAULT DRONE"); 
     assaultPackage.add("AC-130"); 
     assaultPackage.add("PAVE LOW"); 
     assaultPackage.add("JUGGERNAUT"); 
     assaultPackage.add("OSPREY GUNNER"); 



     // Construct Expandable List 
     final String NAME = "name"; 
     final String IMAGE = "image"; 
     final String DATA = "data"; 
     final String NUMBER = "number"; 

     final LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     final ArrayList<HashMap<String, String>> headerData = new ArrayList<HashMap<String, String>>(); 

     final HashMap<String, String> group1 = new HashMap<String, String>(); 
     group1.put(NAME, "Assault Package"); 
     headerData.add(group1); 

     final ArrayList<ArrayList<HashMap<String, Object>>> childData = new ArrayList<ArrayList<HashMap<String, Object>>>(); 

     final ArrayList<HashMap<String, Object>> group1data = new ArrayList<HashMap<String, Object>>(); 
     childData.add(group1data); 

     int assaultPackageCounter = 0; 
     for(int arm = 0; arm < assaultPackage.size(); ++arm) { 
      final HashMap<String, Object> assaultPackageMap = new HashMap<String, Object>(); 
      assaultPackageMap.put(NAME, assaultPackage.get(arm)); 
      if(assaultPackageCounter == 0) { 
       assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.uav)); 
       assaultPackageMap.put(DATA, "UAV DESCRIPTION"); 
       assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.three)); 
      } 
      if(assaultPackageCounter == 1) { 
       assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.carepackage)); 
       assaultPackageMap.put(DATA, "CARE PACKAGE DESCRIPTION"); 
       assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.four)); 
      } 
      if(assaultPackageCounter == 2) { 
       assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.ims)); 
       assaultPackageMap.put(DATA, "IMS DESCRIPTION"); 
       assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.five)); 
      } 
      if(assaultPackageCounter == 3) { 
       assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.predatormissile)); 
       assaultPackageMap.put(DATA, "PREDATOR MISSILE DESCRIPTION"); 
       assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.five)); 
      } 
      if(assaultPackageCounter == 4) { 
       assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.sentrygun)); 
       assaultPackageMap.put(DATA, "SENTRY GUN DESCRIPTION"); 
       assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.five)); 
      } 
      if(assaultPackageCounter == 5) { 
       assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.precisionairstrike)); 
       assaultPackageMap.put(DATA, "PRECISION AIRSTRIKE DESCRIPTION"); 
       assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.six)); 
      } 
      if(assaultPackageCounter == 6) { 
       assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.attackhelicopter)); 
       assaultPackageMap.put(DATA, "ATTACK HELICOPTER DESCRIPTION"); 
       assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.seven)); 
      } 
      if(assaultPackageCounter == 7) { 
       assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.straferun)); 
       assaultPackageMap.put(DATA, "STRAFE RUN DESCRIPTION"); 
       assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.nine)); 
      } 
      if(assaultPackageCounter == 8) { 
       assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.ahsixoverwatch)); 
       assaultPackageMap.put(DATA, "AH-6 OVERWATCH DESCRIPTION"); 
       assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.nine)); 
      } 
      if(assaultPackageCounter == 9) { 
       assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.reaper)); 
       assaultPackageMap.put(DATA, "REAPER DESCRIPTION"); 
       assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.nine)); 
      } 
      if(assaultPackageCounter == 10) { 
       assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.assaultdrone)); 
       assaultPackageMap.put(DATA, "ASSAULT DRONE DESCRIPTION"); 
       assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.ten)); 
      } 
      if(assaultPackageCounter == 11) { 
       assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.aconethreezero)); 
       assaultPackageMap.put(DATA, "AC-130 DESCRIPTION"); 
       assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.twelve)); 
      } 
      if(assaultPackageCounter == 12) { 
       assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.pavelow)); 
       assaultPackageMap.put(DATA, "PAVE LOW DESCRIPTION"); 
       assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.twelve)); 
      } 
      if(assaultPackageCounter == 13) { 
       assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.juggernaut)); 
       assaultPackageMap.put(DATA, "JUGGERNAUT DESCRIPTION"); 
       assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.fifteen)); 
      } 
      if(assaultPackageCounter == 14) { 
       assaultPackageMap.put(IMAGE, getResources().getDrawable(R.drawable.ospreygunner)); 
       assaultPackageMap.put(DATA, "OSPREY GUNNER DESCRIPTION"); 
       assaultPackageMap.put(NUMBER, getResources().getDrawable(R.drawable.seventeen)); 
      } 
      assaultPackageCounter++; 
      group1data.add(assaultPackageMap); 
     } 
     assaultPackageCounter = 0; 

     // Set up some sample data in both groups 
     /*for(int i=0; i<10; ++i) { 
      final HashMap<String, Object> map = new HashMap<String,Object>(); 
      map.put(NAME, "Child " + i); 
      //map.put(DATA, "Data " + i); 
      map.put(IMAGE, getResources().getDrawable((i%3==0? R.drawable.arrowright : R.drawable.arrowdown))); 
      (i%2==0 ? group1data : group2data).add(map); 
     }*/ 

     listPrimaryWeapon.setAdapter(new SimpleExpandableListAdapter(
       this, 
       headerData, 
       R.layout.group_row, 
       new String[] { NAME, DATA }, // the names of the data 
       new int[] { R.id.groupname }, // the text field to populate with the field data 
       childData, 
       0, 
       null, 
       new int[] {} 
      ) { 
       @Override 
       public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
        final View v = super.getChildView(groupPosition, childPosition, isLastChild, convertView, parent); 

        // Populate your custom view here 
        ((TextView)v.findViewById(R.id.name)).setText((String) ((Map<String,Object>)getChild(groupPosition, childPosition)).get(NAME)); 
        ((TextView)v.findViewById(R.id.textView1)).setText((String) ((Map<String,Object>)getChild(groupPosition, childPosition)).get(DATA)); 
        ((ImageView)v.findViewById(R.id.image)).setImageDrawable((Drawable) ((Map<String,Object>)getChild(groupPosition, childPosition)).get(IMAGE)); 
        ((ImageView)v.findViewById(R.id.imageView1)).setImageDrawable((Drawable) ((Map<String,Object>)getChild(groupPosition, childPosition)).get(NUMBER)); 
        CheckBox cb = (CheckBox)v.findViewById(R.id.checkBox1); 
        cb.setClickable(false); 
        return v; 
       } 

       @Override 
       public View newChildView(boolean isLastChild, ViewGroup parent) { 
        return layoutInflater.inflate(R.layout.strikepackagelayout, null, false); 
       } 
      } 
     ); 
     ExpandableListView list = (ExpandableListView) findViewById(R.id.listView1); 
     list.setChoiceMode(ExpandableListView.CHOICE_MODE_MULTIPLE); 
     list.setOnChildClickListener(new OnChildClickListener(){ 
      public boolean onChildClick(ExpandableListView parent, View v, 
        int groupPosition, int childPosition, long id) { 
       CheckBox cb = (CheckBox)v.findViewById(R.id.checkBox1); 
       if(cb != null){ 
        cb.toggle(); 
       } 
       Log.d("type", "Group: " + groupPosition + ", Child: " + childPosition); 
       System.out.println("Group:"+groupPosition+", Child: "+childPosition); 
       return true; 
      } 
     }); 
     listPrimaryWeapon.expandGroup(0); 




    } 
} 

答えて

0

これは、ExpandableListViewで使用するリサイクルビューを使用しているためです。あなたが見ることができるように、画面に既に存在するViewと同じIDでリサイクルされるビューを含む "View convertView"フィールドがあります。したがって、v.findViewById(R.id.checkBox1)を探すときには、IDを持つ複数の「v」要素が存在する可能性があります。これにより、Androidは複数のCheckBoxを選択します。私が今知っているそれを上書きする唯一の方法は、 "covertView"をsuper.getChildView(...)から削除し、それを "null"に置き換えることです。それは本当にGC非友好ですが、他に何をするか。

私はすぐにそれをより効率的な方法で実行するよう調査します。

更新日: 私は他の方法でそれを考え出しました。選択したチェックボックスを含むフィールドを作成しました。その後、私はsetTag(...)のビューにチェックボックスを付けて、フィールドに保存します。

2

Expandable list view移動するたびにビューをリサイクルします。各ビューの状態を保存する必要があります。

1>各チェックボックスに異なるIDを設定します。そのようなもの checkBox.setId(groupPosition + 1);

2>

checkBox.setOnCheckedChangeListener(
new CompoundButton.OnCheckedChangeListener() { 

            @Override 
            public void onCheckedChanged(if (checkBox.isChecked()) { 
              mapViewState.put(checkBox.getId(), 
                checkBoxSelected); 
             } else { 
              mapViewState.remove(checkBox 
                .getId()); 
             } 

            } 
           }); 

ようなハッシュマップオブジェクトに選択されたチェックボックスのIDを追加し、ハッシュマップからチェックボックスの状態をロードし、または選択された値を取得することを繰り返します。

関連する問題