我正在处理一个可扩展列表,如下所示:
可展开列表活动有一个名为“onGroupExpand”的方法,允许您在父级展开及其子级公开之前执行某些工作。
在我的例子中,我想给每个子的复选框附加一个checkchangehandler,这样当它被单击时,我可以将子标记为完成。当父项展开时,我将显示列表和子项,但我的复选框不起任何作用。
然后,我尝试在“onGroupExpand”方法中动态添加复选框处理程序。但是,当ongroupexpand被触发时,我在尝试获取对每个子视图的引用时会收到一个非法的强制转换异常。
public void onGroupExpand (int groupPosition) {
int numOfChildren = expListAdapter.getChildrenCount(groupPosition);
for(int i = 0; i < numOfChildren; i++)
{
//Get exception here because getChild() returns Object - but how else can
//can I attach a check box to each child?
View v = (View) expListAdapter.getChild(groupPosition, i);
CheckBox cb = (CheckBox)v.findViewById( R.id.checkComplete );
cb.setOnCheckedChangeListener(new OnCheckedChangeListener(){
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
Toast.makeText(getBaseContext(), "Check Changed for " + groupPosition, 2000);
}
});
}
我的主要问题是获取对子视图的引用,以便可以动态附加处理程序。请查看我尝试执行此操作的代码注释。
谢谢你的时间…
最佳答案
我相信问题是
View v = (View) expListAdapter.getChild(groupPosition, i);
不返回
View
但返回该位置的数据。您可能正在使用字符串或prefs对象或其他内容。您将获得它的底层对象,您可以对该对象进行更改。在以下方法中创建视图时(ListView会自动调用此方法),您可以设置任何OnCheckChanged侦听器:abstract View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)
添加示例代码
下面是一个示例适配器,它可以实现您想要的功能。视图是在适配器上创建的,而不是在活动上创建的。我假设您正在活动中创建SimpleExpandableListAdapter。相反,添加以下类并创建该视图。
import java.util.List;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.SimpleExpandableListAdapter;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;
public class ExampleAdapter extends SimpleExpandableListAdapter {
protected Context mContext;
public ExampleAdapter(ExampleActivity exampleActivity, List createGroupList, int groupRow, String[] strings, int[] is, List createChildList, int childRow, String[] strings2, int[] is2) {
super(exampleActivity, createGroupList, groupRow, strings, is, createChildList, childRow, strings2, is2);
mContext = exampleActivity;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
View v = super.getChildView(groupPosition, childPosition, isLastChild, convertView, parent);
if (v != null) {
final String value = "Check Changed for " + groupPosition + " " + childPosition;
CheckBox cb = (CheckBox)v.findViewById( R.id.checkComplete );
cb.setOnCheckedChangeListener(new OnCheckedChangeListener(){
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
Toast toast = Toast.makeText(mContext, value, 2000);
toast.show();
}
});
}
return v;
}
}