好的,因此我似乎在使用于gridView的自定义RelativeLayout的setChecked方法正确调用方面遇到麻烦。到目前为止,我的方法是:在每次旋转之间保留一个布尔值列表,以便在调用gridview的基本适配器的getView方法时,可以根据是否选中布尔值来设置一些数据。我的想法是,当设备更改方向时,我将保留一个布尔数组。但是,无论我尝试什么,我似乎都无法使我的getView方法真正正确地使用setChecked。到目前为止,这是我的代码:

自定义RelativeLayout:

    public class CustomRelativeLayoutForGridView extends RelativeLayout implements
            Checkable {

        private boolean checked = false;
        private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked };

        public CustomRelativeLayoutForGridView(Context context, AttributeSet attrs,
                int defStyle) {
            super(context, attrs, defStyle);
        }

        public CustomRelativeLayoutForGridView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public CustomRelativeLayoutForGridView(Context context) {
            super(context);
        }

        @Override
        protected int[] onCreateDrawableState(int extraSpace) {
            final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
            if (isChecked())
                mergeDrawableStates(drawableState, CHECKED_STATE_SET);
            return drawableState;
        }

        @Override
        public boolean isChecked() {
            return checked;
        }

        @Override
        public void setChecked(boolean _checked) {
            checked = _checked;
            setBackgroundColor(checked ? 0xFF00FF00 : 0x00000000);
            refreshDrawableState();
        }

        @Override
        public void toggle() {
            setChecked(!checked);
        }
    }


持有人:

    class myViewHolder {
        TextView text;
        ImageView icon;
        CustomRelativeLayoutForGridView rLayout;
        myViewHolder(View v) {
            text = (TextView) v.findViewById(R.id.grid_item_label);
            icon = (ImageView) v.findViewById(R.id.grid_item_image);
            rLayout = (CustomRelativeLayoutForGridView) v.findViewById(R.id.gridViewCellLayout);
        }
    }


getView:

    public View getView(final int position, View convertView, ViewGroup parent) {
            View gridView = convertView;
            myViewHolder holder = null;
            if (gridView == null) {
                gridView = new View(context);
                // get layout from mobile.xml
                LayoutInflater inflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                gridView = inflater.inflate(R.layout.file_manager_display_item,
                        null);
                holder = new myViewHolder(gridView);
                gridView.setTag(holder);
            } else {
                holder = (myViewHolder) convertView.getTag();
            }
            holder.text.setText(direcsPics[position].getName());
            if(imageSelected[position]) {
                holder.rLayout.setChecked(true);
            } else {
                holder.rLayout.setChecked(false);
            }
            return gridView;
        }


如您在getView方法中看到的那样,我正在明确地调用setChecked方法,但是似乎什么也没有发生。我已经仔细检查过布尔值是否已正确保留,但setChecked似乎根本不做任何事情。外面有人希望知道发生了什么事以及如何解决此问题吗?我会很感激我能得到的任何帮助^ _ ^我已经在这个代码上工作了一个星期,但是没有运气=(

最佳答案

好!终于弄明白了,我认为=)对我来说是一个真正的脑筋急转弯。首先,我来看一下真​​正让我感到困惑的部分:

if(imageSelected[position]) {
    holder.rLayout.setChecked(true);
} else {
    holder.rLayout.setChecked(false);
}


注意我的setChecked调用。这是我感到困惑的地方,我的意思是自定义RelativeLayout中的代码肯定会更改背景颜色,因为在删除setBackgroundColor行之后,我的突出显示不再起作用。
好吧,我对RelativeLayout的setChecked方法进行了一些Log调用,而在这里我对setChecked进行了调用,但是我注意到对setChecked的调用比我做的要多得多,而所有这些调用都是在我的之后。因此,android撤回了视图。好吧,然后我想起了如何在xml中设置gridview:

<GridView
    android:id="@+id/gridView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_above="@+id/fileManagerAcceptButton"
    android:columnWidth="100dp"
    android:drawSelectorOnTop="false"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:gravity="center"
    android:horizontalSpacing="5dp"
    android:choiceMode="multipleChoice"
    android:numColumns="auto_fit"
    android:stretchMode="columnWidth"
    android:verticalSpacing="5dp" >
</GridView>


注意到选择模式?因此,如果有其他方法优先于setChecked调用,则可能是这样。因此,也许我需要告诉gridview父级检查了什么,而不是尝试在子级中指定它。之后,我返回到我的活动并将其添加到我的OnCreateView(这是一个对话框片段):

for (int i = 0; i < gridView.getCount(); i++) {
    if (transferBoolArray[i]) {
        gridView.setItemChecked(i, true);
    } else {
        gridView.setItemChecked(i, false);
    }
}


为我解决的问题=)我只希望我的回答将来对某人有所帮助^ _ ^

07-26 09:32