0

我有一个带有 TextView 和 Checkbox(带有按钮图像)的自定义 ListView,当单击 textview 时,隐藏的布局会针对该特定行展开,当单击复选框时,该特定行被选中进行删除。ClasCcastException当我将视图标记为 CheckBox 的ViewHolder类对象时,我得到了这个。这是我的代码,holderOnCheckedChangeListener

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

我希望我的问题很清楚。非常感谢任何形式的帮助或建议。谢谢 !

编辑

日志猫 -

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)
4

3 回答 3

2

在没有看到您的布局 xml 文件的情况下,我只能猜测,但您的复选框似乎不像您的 TextView 那样是根视图(行视图组)的直接子级。

所以首先:检查这个层次结构:复选框和根视图组之间是否有另一个视图组?(由 checkbox.getParent 指向并导致 classcastException 的那个)

第二:您应该考虑简化此代码,您尝试实现的目标似乎有点复杂......

第三:如果您想要更好的答案,请显示 lawout xml 文件;)

于 2013-03-09T08:41:52.617 回答
0

什么是 buttonView,为什么你认为它的父级有一个标签是 ViewHolder 的实例?第二点是——使用 ViewHolder holder = null。这将防止在 OnClickListeners 中使用错误的持有者。

于 2013-03-09T08:12:28.003 回答
0

buttonview 的父级不包含视图持有者的标签。标签包含在列表项中。您将在项目点击侦听器上获得标签。

您可以使用要在单击复选框时显示的视图的 setVisibility(View.GONE)。

对于按钮视图的父级,您可以获得用于打开/关闭可见性的视图。

于 2013-03-09T08:28:03.840 回答