好的,因此我似乎在使用于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);
}
}
为我解决的问题=)我只希望我的回答将来对某人有所帮助^ _ ^