2016-08-09 212 views
1

Ich entschuldige mich für mein Englisch. Ich versuche, eine Anwendung zu schreiben, die Kontrollkästchen in ExpandableListView verwenden, aber wenn ich auf eine Elementliste klicke, überprüfte die Liste das angeklickte Element und nachfolgende Elemente mit Punkt 6. Wenn ich zum Beispiel auf das erste Element klicke, werden zusätzlich zu der erste, der sechste der zwölfte etc. etc. Unten ist mein CodeExpandablelistview android mit checkbox on onclick Weitere Artikel auswählen

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; 
}} 

Antwort

0

zunächst sollten Sie eine Datenstruktur fügen Sie den Status aller Kontrollkästchen zu halten:

private SparseArray<SparseArray<Boolean>> checked; 

Richten Sie einige zusätzliche Methoden auf Ihrem Adapter:

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)); 
} 

Jetzt können Sie die geprüfte Wert in getView erhalten, wenn Sie das Kontrollkästchen einrichten, und legen Sie die geprüfte Wert aus dem Event-Handler:

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(); 
    } 
}); 

Diese ist eine Möglichkeit, überprüften Zustand zu behandeln. Anstatt eines separaten verschachtelten SparseArray, würde es sinnvoller sein, wenn Sie eine "checked" -Eigenschaft zu Ihrer Klasse Mestieri hinzugefügt und stattdessen verwendet.

Hinweis: Um alle diese Kontrollkästchen beizubehalten, wenn das Gerät gedreht wird, müssen Sie die überprüften Werte irgendwie in onSaveInstanceState() speichern.

0

Ich habe mit diesem Code-Schnipsel gelöst:

@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; }