我有一个带有TextView和Checkbox(带按钮图像)的自定义ListView,当单击textview时,隐藏的布局会针对该特定行展开,当单击复选框时,选择要删除的特定行。当我将视图标记为ClasCcastException
类对象ViewHolder
以获取CheckBox的holder
时,我收到此OnCheckedChangeListener
。
这是我的代码,
CustomListView.class
public View getView(final int position, View convertView, ViewGroup parent) {
holder = null;
DataFields rowItems = (DataFields) getItem(position);
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = inflater.inflate(R.layout.home_field_row, null);
holder = new ViewHolder();
holder.dataFields = items.get(position);
holder.mName = (TextView) convertView
.findViewById(R.id.hmFieldName);
holder.mDeleteCheck = (CheckBox) convertView
.findViewById(R.id.deleteCheck);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.mDeleteCheck.setTag(position);
holder.mName.setTag(position);
holder.mName.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
holder = (ViewHolder) ((View) v.getParent()).getTag(); //Works fine here
...
}
});
holder.mDeleteCheck
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
holder = (ViewHolder) ((View) buttonView.getParent()).getTag(); //throwing ClassCastException
...
}
});
holder.mName.setText(rowItems.getName());
holder.mDeleteCheck.setChecked(deletePositions[position]);
return convertView;
}
我希望我的问题很明确。任何形式的帮助或建议都非常感谢。谢谢!
修改
Logcat -
03-09 12:08:45.789: E/AndroidRuntime(3661): FATAL EXCEPTION: main
03-09 12:08:45.789: E/AndroidRuntime(3661): java.lang.ClassCastException: java.lang.Integer
03-09 12:08:45.789: E/AndroidRuntime(3661): at com.inkers.forgetpassword.utility.CustomListArrayAdapter$1.onCheckedChanged(CustomListArrayAdapter.java:173)
03-09 12:08:45.789: E/AndroidRuntime(3661): at android.widget.CompoundButton.setChecked(CompoundButton.java:124)
03-09 12:08:45.789: E/AndroidRuntime(3661): at android.widget.CompoundButton.toggle(CompoundButton.java:86)
03-09 12:08:45.789: E/AndroidRuntime(3661): at android.widget.CompoundButton.performClick(CompoundButton.java:98)
答案 0 :(得分:2)
如果没有看到您的布局xml文件,我只能猜测,但您的复选框似乎不是您的根视图(行视图组)的直接子项,因为您的TextView是。
首先:检查此层次结构:复选框和根视图组之间是否有另一个ViewGroup? (由checkbox.getParent指向的那个并导致classcastException)
第二:你应该考虑简化这段代码,你试图实现的目标看起来有点复杂......
第三:如果你想要更好的答案,请显示lawout xml文件;)
答案 1 :(得分:0)
什么是buttonView,为什么你认为它的父母有一个标签,它是ViewHolder的一个实例?第二点是 - 使用ViewHolder holder = null。这样可以防止在OnClickListeners中使用错误的持有者。
答案 2 :(得分:0)
buttonview的父级不包含视图持有者的标记。标签包含在列表项中。您将在项目点击监听器上获得标记。
您可以在单击复选框时使用要显示的视图的setVisibility(View.GONE)。
对于按钮视图的父级,您可以获得用于开启/关闭可见性的视图。