尝试使用getChildAt()取消select视图

我在一个ExpandableListView使用了一个GridView

我有一个函数,突出显示一个项目,当它被点击,现在我试图实现一个button,当按下它将取消select所有选定的项目,但它是不选中最后一个点击

 public class GridAdapter extends BaseAdapter { private Context mContext; private ArrayList<Filhos> child; public ArrayList<CadastraEscolas> escola; private ArrayList<ArrayList<Filhos>> filhos = new ArrayList(); public GridAdapter(Context context, ArrayList<CadastraEscolas> groups, ArrayList<Filhos> childValues, int groupPosition) { mContext = context; child = childValues; escola = groups; posicaoEscola = groupPosition; } @Override public int getCount() { return child.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int arg0) { return 0; } @Override public View getView(final int position, View convertView, final ViewGroup parent) { holder = null; if (convertView == null) { LayoutInflater inflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.child_item, null); holder = new ViewHolder(); final TextView idAluno = (TextView) convertView.findViewById(R.id.idcrianca); final TextView nomeAluno = (TextView) convertView.findViewById(R.id.name); convertView.setTag(holder); final View finalConvertView = convertView; convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (list.size() > 0) { isChecked = filhos.get(posicaoEscola).get(position).isChecked(); if (!isChecked) { selecao(true, position, nomeAluno, 0xFFFFFFFF, finalConvertView, View.VISIBLE); } else { selecao(false, position, nomeAluno, 0xFFD5672B, finalConvertView, View.GONE); } ex.findViewById(R.id.notificar).setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { limpaSelecao(false, position, nomeAluno, 0xFFD5672B, parent, View.GONE); } }); } }); } else { holder = (ViewHolder) convertView.getTag(); } holder.text.setText(child.get(position).getNome()); return convertView; } static class ViewHolder { TextView text; } public void selecao(boolean check, int position, TextView nomeAluno, int color, View v, int visibility) { filhos.get(posicaoEscola).get(position).setChecked(check); nomeAluno.setTextColor(color); v.findViewById(R.id.overlay).setVisibility(visibility); v.findViewById(R.id.overlayText).setVisibility(visibility); } public void limpaSelecao(boolean check, int position, TextView nomeAluno, int color, ViewGroup v, int visibility) { for (int x = 0; x < group.size(); x++) { for (int j = 0; j < group.get(x).getalunos().size(); j++) { if(filhos.get(x).get(j).isChecked()){ v.getChildAt(j).findViewById(R.id.loadingPanel).findViewById(R.id.overlay).setVisibility(View.GONE); } nomeAluno.setTextColor(color); } } } } 

布局:

 <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" android:background="@drawable/nomealuno_main" android:layout_below="@+id/child"> <View android:id="@+id/overlay" android:layout_width="125dp" android:layout_height="50dp" android:background="@color/bgOverlay" android:visibility="gone"/> </RelativeLayout> 

这是发生了什么事情:

当我从A到B这样select所有的项目时:

在这里输入图像说明

并清除,只会从我点击的最后一个组中删除选定的孩子:

在这里输入图像说明

当我点击“清除”时,我需要将它们全部删除,所有的孩子,无论他们在什么组中都必须被删除。

ExpandableAdapter:

 public class ExpandListTest extends BaseExpandableListAdapter { public static final int CHOICE_MODE_MULTIPLE = AbsListView.CHOICE_MODE_MULTIPLE; public static final int CHOICE_MODE_MULTIPLE_MODAL = AbsListView.CHOICE_MODE_MULTIPLE_MODAL; /** * No child could be selected */ public static final int CHOICE_MODE_NONE = AbsListView.CHOICE_MODE_NONE; /** * One single choice per group */ public static final int CHOICE_MODE_SINGLE_PER_GROUP = AbsListView.CHOICE_MODE_SINGLE; /** * One single choice for all the groups */ public static final int CHOICE_MODE_SINGLE_ABSOLUTE = 10001; private Context context; public static ArrayList<CadastraEscolas> groups; private ArrayList<ArrayList<Filhos>> child = new ArrayList(); private HashMap<String, GPSEscolas> aMap = new HashMap<String, GPSEscolas>(); private HashMap<String, GPSEscolas> HashTask = new HashMap<String, GPSEscolas>(); public static ArrayList<Filhos> listchild; private GridAdapter adapter; private SecurePreferences Sessao; public static CustomGridView gridView; private SparseArray<SparseBooleanArray> checkedPositions; private static final String LOG_TAG = ExpandListAdapter.class.getSimpleName(); public ExpandListTest(Context context, ArrayList<CadastraEscolas> groups, HashMap<String, GPSEscolas> data, SecurePreferences mSessao, HashMap<String, GPSEscolas> hashTask) { this.context = context; this.groups = groups; this.aMap = data; this.Sessao = mSessao; checkedPositions = new SparseArray<SparseBooleanArray>(); child = new ArrayList(); if (groups != null) { for (int i = 0; i < groups.size(); i++) { child.add(i, groups.get(i).getalunos()); } } } @Override public Object getChild(int groupPosition, int childPosition) { return child.get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, final ViewGroup parent) { if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) context .getSystemService(context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.gridview, null); } listchild = new ArrayList<Filhos>(); for (int j = 0; j < groups.get(groupPosition).getalunos().size(); j++) { listchild.add(child.get(groupPosition).get(j)); } gridView = (CustomGridView) convertView.findViewById(R.id.GridView_toolbar); gridView.setExpanded(true); adapter = new GridAdapter(context, groups, listchild, child, groupPosition, aMap, HashTask, Sessao); gridView.setAdapter(adapter);// Adapter gridView.setChoiceMode(CustomGridView.CHOICE_MODE_MULTIPLE); return convertView; } @Override public int getChildrenCount(int nGroup) { return 1; } @Override public Object getGroup(int groupPosition) { return groups.get(groupPosition); } @Override public int getGroupCount() { return groups.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { CadastraEscolas group = (CadastraEscolas) getGroup(groupPosition); if (convertView == null) { LayoutInflater inf = (LayoutInflater) context .getSystemService(context.LAYOUT_INFLATER_SERVICE); convertView = inf.inflate(R.layout.group_item, null); } ExpandableListView mExpandableListView = (ExpandableListView) parent; mExpandableListView.expandGroup(groupPosition); TextView tv = (TextView) convertView.findViewById(R.id.group_name); tv.setText(group.getNome_fantasia()); return convertView; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } 

Solutions Collecting From Web of "尝试使用getChildAt()取消select视图"

Android ViewGroups可以包含任意数量的视图,但视图只能有一个父ViewGroup,如果你试图添加一个已经有父视图的View,你将得到这个exception(来自ViewGroup.addViewInner()):

 throw new IllegalStateException("The specified child already has a parent. " + "You must call removeView() on the child's parent first."); 

这意味着布局的结构是树(而不是图)的布局结构,因此可以使用任何树遍历algorithm遍历布局的每个视图。

以下是可能的algorithm之一,这是一个后序遍历。

在这里输入图像说明

它通过根元素,获取第一个子元素,并对该algorithm进行recursion调用,然后是第二个,第三个等等。当没有剩下子元素时,它会调用您对该节点的取消selectfunction。

对于图中的树,节点将按以下顺序取消select:

A,C,E,D,B,H,I,G,F

 public void onClickTheButton(View view) { unselectall(R.layout.your_layout); } public void unselectAll(View view) { if(view instanceof ViewGroup) { for(int ii = 0 ; ii<(ViewGroup)view.getChildrenCount(); ii++) { unselectAll((ViewGroup)view.getChildAt(ii)); } } unselect(view); } 

你可以在这里find许多其他的方法: https : //en.wikipedia.org/wiki/Tree_traversal

如果您想要简化您的编程体验,那么了解这些algorithm的工作方式是必须的。

改变你的getView()方法如下。

 @Override public View getView(final int position, View convertView, final ViewGroup parent) { holder = null; if (convertView == null) { LayoutInflater inflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.child_item, null); holder = new ViewHolder(); final TextView idAluno = (TextView) convertView.findViewById(R.id.idcrianca); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.text.setText(child.get(position).getNome()); final View finalConvertView = convertView; convertView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (list.size() > 0) { isChecked = filhos.get(posicaoEscola).get(position).isChecked(); if (!isChecked) { selecao(true, position, nomeAluno, 0xFFFFFFFF, finalConvertView, View.VISIBLE); } else { selecao(false, position, nomeAluno, 0xFFD5672B, finalConvertView, View.GONE); } ex.findViewById(R.id.notificar).setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { limpaSelecao(false, position, nomeAluno, 0xFFD5672B, parent, View.GONE); } }); } }); return convertView; }