1

我想为单击的图像视图画一个复选标记,并在使用以下代码片段之前取消选中我单击的图像视图。我将最后检查的位置存储在 mDeviceAdapter 中。当我尝试取消选中旧位置时,即使对于部分可见的图像视图,图像视图也总是给出 null。我真的很困惑,因为我认为只有不可见的被回收...... Android 新手,任何评论都值得赞赏。

    public void CheckableImageView#setChecked(boolean checked) {
    if (mChecked != checked) {
        mChecked = checked;
        invalidate();
    }
}

    mDeviceGallery.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {

                    CheckableImageView viewToCheck = (CheckableImageView) view;
                    if (!viewToCheck.isChecked()) {
                        int oldCheckedPosition = mDeviceAdapter
                                .getCheckedPosition();
                        mDeviceAdapter.setCheckedPosition(position);
                        View checkedView = mDeviceGallery
                                .getChildAt(oldCheckedPosition);
                        Log.d(TAG, "old position="+oldCheckedPosition + "old view="+checkedView);
                        if (checkedView != null) {
                            ((CheckableImageView) checkedView)
                                    .setChecked(false);
                            Log.d(TAG, "uncheck position="
                                    + oldCheckedPosition);
                        }
                        viewToCheck.setChecked(true);
4

1 回答 1

0

这不是正确的做法。您需要在数据类型中添加一个布尔字段(即 mIsChecked)。在onItemClick方法上将该变量的值设置为 true 并将其 INDEX 保留为适配器的成员。单击另一个项目时,将该项目的值设置为 true,并将保存的项目的值设置为 false(更改您ArrayList在上次单击中存储的 INDEX 中的数据类型的值)。

现在,在getView()方法中,您必须有 if/else 语句。就像是:

if (item.isChecked())
{
    checkedView.setChecked(true);
}
else
{
    checkedView.setChecked(false);
}

方法示例onClick:(只是一个大方向)

if (item.isChecked())
    {
        checkedView.setChecked(false);
        yourList.get(position).setChecked(true);
        yourList.get(mLastCheckedIndex).setChecked(false);
        mLastCheckedIndex = position;
        notifyDataSetChanged();
    }
    else
    {
        //same but opposite.
    }

希望这可以帮助!

于 2012-10-02T16:50:03.190 回答