2016-08-09 7 views
1

私は自分の英語を謝ります。 ExpandableListViewにチェックボックスを使用するアプリケーションを作成しようとしていますが、アイテムリストをクリックすると、クリックされたアイテムとその後のアイテムがピリオド6でチェックされます。たとえば、アイテムをクリックすると、まず、第十二第六などなど以下 私のコードexpandablelistview onroid with checkbox onclickもっと商品を選択

example

prepareListData(); 
    expandableListView = (ExpandableListView)findViewById(R.id.expandableListViewProfessioni); 
    expandableListAdapterProfessioni = new ExpandableListAdapterProfessioni(this,listDataHeader,listDataProfessioni); 

    expandableListView.setAdapter(expandableListAdapterProfessioni); 


    expandableListView.setOnGroupClickListener(new OnGroupClickListener() { 

     @Override 
     public boolean onGroupClick(ExpandableListView parent, View v, 
            int groupPosition, long id) { 
      setListViewHeight(parent, groupPosition); 

      return false; 
     } 
    }); 


    expandableListView.setOnChildClickListener(new OnChildClickListener() { 

     @Override 
     public boolean onChildClick(ExpandableListView parent, View v, 
            int groupPosition, int childPosition, long id) { 
      return false; 
     } 
    });private void prepareListData() { 
    listDataHeader = new ArrayList<String>(); 
    listDataProfessioni = new HashMap<String, ArrayList<Mestieri>>(); 
    listDataHeader.add("Professione svolta"); 

    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    Gson gson = new Gson(); 
    String json = sharedPrefs.getString("HomeActivity", null); 
    Type type = new TypeToken<ArrayList<Mestieri>>() {}.getType(); 
    ArrayList<Mestieri> professioni = gson.fromJson(json, type); 

    listDataProfessioni.put(listDataHeader.get(0), professioni); 
} 

private void setListViewHeight(ExpandableListView listView, 
           int group) { 
    ExpandableListAdapter listAdapter = (ExpandableListAdapter) listView.getExpandableListAdapter(); 
    int totalHeight = 0; 
    int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), 
      View.MeasureSpec.EXACTLY); 
    for (int i = 0; i < listAdapter.getGroupCount(); i++) { 
     View groupItem = listAdapter.getGroupView(i, false, null, listView); 
     groupItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED); 

     totalHeight += groupItem.getMeasuredHeight(); 

     if (((listView.isGroupExpanded(i)) && (i != group)) 
       || ((!listView.isGroupExpanded(i)) && (i == group))) { 
      for (int j = 0; j < listAdapter.getChildrenCount(i); j++) { 
       View listItem = listAdapter.getChildView(i, j, false, null, 
         listView); 
       listItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED); 

       totalHeight = 700; 

      } 
     } 
    } 

    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    int height = totalHeight 
      + (listView.getDividerHeight() * (listAdapter.getGroupCount() - 1)); 
    if (height < 10) 
     height = 200; 
    params.height = height; 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 

}/**************** ADAPTER *******************/public class ExpandableListAdapterProfessioni extends BaseExpandableListAdapter{ 

private Context _context; 
private List<String> _listDataHeader; 

public static ArrayList<String> listaProfessioni; 

private HashMap<String, ArrayList<Mestieri>> _listDataChild; 

public ExpandableListAdapterProfessioni(Context context, List<String> listDataHeader, 
          HashMap<String, ArrayList<Mestieri>> listChildData) { 
    this._context = context; 
    this._listDataHeader = listDataHeader; 
    this._listDataChild = listChildData; 
} 

@Override 
public Object getChild(int groupPosition, int childPosititon) { 
    return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
      .get(childPosititon).getNome(); 
} 

@Override 
public long getChildId(int groupPosition, int childPosition) { 
    return childPosition; 
} 

@Override 
public View getChildView(final int groupPosition, final int childPosition, 
         boolean isLastChild, View convertView, ViewGroup parent) { 

    final String childText = (String) getChild(groupPosition, childPosition); 

    listaProfessioni = new ArrayList<String>(); 

    if (convertView == null) { 
     LayoutInflater infalInflater = (LayoutInflater) this._context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = infalInflater.inflate(R.layout.expandable_listview_item_professioni, null); 
    } 

    TextView txtListChild = (TextView) convertView 
      .findViewById(R.id.expandableListViewProfessioniItem); 

    txtListChild.setText(childText); 

    final CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.checkBoxItem); 

    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      if(checkBox.isChecked()){ 
       checkBox.setChecked(false); 

      }else { 
       checkBox.setChecked(true); 

       //listaProfessioni.add(getChild(groupPosition,childPosition).toString()); 
      } 

     } 
    }); 

    return convertView; 
} 

@Override 
public int getChildrenCount(int groupPosition) { 
    return this._listDataChild.get(this._listDataHeader.get(groupPosition)) 
      .size(); 
} 

@Override 
public Object getGroup(int groupPosition) { 
    return this._listDataHeader.get(groupPosition); 
} 

@Override 
public int getGroupCount() { 
    return this._listDataHeader.size(); 
} 

@Override 
public long getGroupId(int groupPosition) { 
    return groupPosition; 
} 

@Override 
public View getGroupView(int groupPosition, boolean isExpanded, 
         View convertView, ViewGroup parent) { 
    String headerTitle = (String) getGroup(groupPosition); 
    if (convertView == null) { 
     LayoutInflater infalInflater = (LayoutInflater) this._context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = infalInflater.inflate(R.layout.expandable_listview_professioni, null); 
    } 

    TextView lblListHeader = (TextView) convertView 
      .findViewById(R.id.expandableListViewProfessioniHeader); 
    lblListHeader.setTypeface(null, Typeface.NORMAL); 
    lblListHeader.setText(headerTitle); 

    return convertView; 
} 

@Override 
public boolean hasStableIds() { 
    return false; 
} 

@Override 
public boolean isChildSelectable(int groupPosition, int childPosition) { 
    return true; 
}} 

答えて

0

まずがあり、あなたはすべてのチェックボックスの状態を維持するためのデータ構造を追加する必要があります:

private SparseArray<SparseArray<Boolean>> checked; 

final CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.checkBoxItem); 
checkBox.setChecked(getChildChecked(groupPosition, childPosition)); 

convertView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

     ExpandableListAdapterProfessioni.this.toggleChild(groupPosition, childPosition); 
     //listaProfessioni.add(getChild(groupPosition,childPosition).toString()); 
     notifyDataSetChanged(); 
    } 
}); 
この:今、あなたはあなたがチェックボックスを設定するとき getViewでチェック値を取得し、イベントハンドラから確認値を設定することができます

public boolean isChildChecked(int groupPosition, int childPosition) { 
    SparseArray children = checked.get(groupPosition); 
    if (children == null) return false; 
    return children.get(childPosition, false); 
} 

public void setChildChecked(int groupPosition, int childPosition, boolean checked) { 
    SparseArray children = checked.get(groupPosition); 
    if (children == null) { 
     children = new SparseArray<Boolean>(); 
     checked.put(groupPosition, children); 
    } 
    children.put(childPosition, checked); 
} 

public void toggleChild(int groupPosition, int childPosition) { 
    setChildChecked(groupPosition, childPosition, 
      ! getChildChecked(groupPosition, childPosition)); 
} 

:あなたのアダプタのいくつかの追加のメソッドを設定しますチェックされた状態を処理する1つの方法です。別のネストされたSparseArrayの代わりに、Mestieriクラスに「チェックされた」プロパティを追加して、それを代わりに使用すると意味があります。

注:デバイスを回転させたときにこれらのチェックボックスをすべて保持するには、チェックされた値を何らかの形でonSaveInstanceState()に保存する必要があります。

0

私はこのスニペットを解決してきた:

@Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {final int mGroupPosition = groupPosition; final int mChildPosition = childPosition; final String childText = (String) getChild(groupPosition, childPosition); if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this._context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.expandable_listview_item_professioni, null); } TextView txtListChild = (TextView) convertView .findViewById(R.id.expandableListViewProfessioniItem); txtListChild.setText(childText); final CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.checkBoxItem); checkBox.setOnCheckedChangeListener(null); if (mChildCheckStates.containsKey(mGroupPosition)) { boolean getChecked[] = mChildCheckStates.get(mGroupPosition); checkBox.setChecked(getChecked[mChildPosition]); } else { boolean getChecked[] = new boolean[getChildrenCount(mGroupPosition)]; mChildCheckStates.put(mGroupPosition, getChecked); checkBox.setChecked(false); } checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { boolean getChecked[] = mChildCheckStates.get(mGroupPosition); getChecked[mChildPosition] = isChecked; mChildCheckStates.put(mGroupPosition, getChecked); } else { boolean getChecked[] = mChildCheckStates.get(mGroupPosition); getChecked[mChildPosition] = isChecked; mChildCheckStates.put(mGroupPosition, getChecked); } } }); convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(checkBox.isChecked()){ checkBox.setChecked(false); }else { checkBox.setChecked(true); } } }); return convertView; }

関連する問題