我有一个GridView
其元素基于一个FrameLayout
包含一个ImageView
和一个CheckedTextView
。FrameLayout的xml文件如下:
<FrameLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
android:id="@+id/gridImage"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:gravity="center_horizontal">
<ImageView
android:id="@+id/image"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:adjustViewBounds="false">
</ImageView>
<CheckedTextView
android:id="@+id/imageTick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:layout_gravity="center_horizontal|bottom"
android:checkMark="@drawable/icon"
android:checked="false"
android:visibility="invisible"
>
</CheckedTextView>
</FrameLayout>
编辑:这是getView()
我用于每个元素的适配器方法:
public View getView(int position, View convertView, ViewGroup parent) {
Log.d("getView()", position+"");
View v;
ImageView imageView;
if(convertView == null) {
v = LayoutInflater.from(mContext).inflate(R.layout.photo_text_view, null);
v.setLayoutParams(new GridView.LayoutParams(100,100));
}
else
{
v = convertView;
}
imageView = (ImageView) v.findViewById(R.id.image);
imageView.setImageBitmap(mThumbsIds.get().get(position));
v.setPadding(8, 8, 8, 8);
return v;
}
在我的活动类中,我加载了一个上下文菜单,一旦我选择了一个选项,我就会使该元素CheckedTextView
可见,如下所示:GridView
GridView gridView = (GridView) findViewById(R.id.gridview);
View selected =gridView.getChildAt(position);
CheckedTextView selectedCheck = (CheckedTextView)selected.findViewById(R.id.imageTick);
selectedCheck.setChecked(true);
selectedCheck.setVisibility(View.VISIBLE);
因此,从这一点开始可能会发生两件事:
1) 假设我在位置 0 选择了元素,CheckedTextView 变得可见,但是当我向下滚动 GridView 时,另一个元素(例如位置 17)的 CheckedTextView 也可见。当我向下滚动到底部时,这会在随机元素上继续。
2)如果我选择一个朝向底部的元素,向上滚动到顶部,然后运行一种方法使所有 CheckedTextView 不可见,NullPointerException
则会为底部的元素抛出一个。这发生在这一点上:View selected =gridView.getChildAt(position);
其中 selected 变为 null。
这里发生了什么?为什么这些随机 CheckedTextView 变得可见,为什么会出现异常?