我的GridView有问题。我正在使用Bitmapfun项目的一部分,我不希望在顶部有一个余量。
看到这个捕获:
我在微调器和第一张照片之间有一个很大的黑色区域(我在那里放了3个问号)。
如果我向下滚动,我会得到一个很好的渲染:照片在旋转器下滑动:
如果我回到顶部,我会在第一张照片之前再次出现这个大黑区。 有人可以帮帮我吗?
这是我的gridview(image_grid_fragment.xml):
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridView"
style="@style/PhotoGridLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="@dimen/image_thumbnail_size"
android:horizontalSpacing="@dimen/image_thumbnail_spacing"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:verticalSpacing="@dimen/image_thumbnail_spacing" >
</GridView>
GridView包含在这个主要布局中:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/TextView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="17dp"
android:layout_marginLeft="16dp"
android:text="Album : "
android:textAppearance="?android:attr/textAppearanceSmallPopupMenu"
android:textSize="18dp" />
<Spinner
android:id="@+id/spinner_album"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/TextView1"
android:layout_marginTop="12dp"
android:inputType="text"
android:textSize="18dp" />
<include layout="@layout/image_grid_fragment" />
</RelativeLayout>
values / styles.xml:
<style name="PhotoGridLayout">
<item name="android:drawSelectorOnTop">false</item>
<item name="android:listSelector">@drawable/photogrid_list_selector</item>
</style>
values-v11 / styles.xml:
<style name="PhotoGridLayout">
<item name="android:drawSelectorOnTop">true</item>
</style>
ImageGridActivity.java:
public class ImageGridActivity extends FragmentActivity {
private static final String TAG = "ImageGridFragment";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getSupportFragmentManager().findFragmentByTag(TAG) == null) {
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(android.R.id.content, new ImageGridFragment(), TAG);
ft.commit();
}
}
}
在开发选项中激活了布局边界,我得到了这个结果:
答案 0 :(得分:1)
@layout/image_grid_fragment
的内容是什么?
如果您尝试更改
,该怎么办?<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridView"
style="@style/PhotoGridLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
...
到
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridView"
style="@style/PhotoGridLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
...
在Android 4.2和系统设置中运行您的应用,开发者选项 - &gt;显示布局边界(放置复选标记)。您将看到它是否是某些视图的填充或边距。
你也可能在gridView适配器的bindView(或getView)中设置错误。
答案 1 :(得分:0)
感谢Roger Alien !!他让我走的正确!
问题出在gridView适配器上:
ImageGridFragment.java的部分源代码:
/**
* The main adapter that backs the GridView. This is fairly standard except the number of
* columns in the GridView is used to create a fake top row of empty views as we use a
* transparent ActionBar and don't want the real top row of images to start off covered by it.
*/
private class ImageAdapter extends BaseAdapter {
private final Context mContext;
private int mItemHeight = 0;
private int mNumColumns = 0;
private int mActionBarHeight = 0;
private GridView.LayoutParams mImageViewLayoutParams;
public ImageAdapter(Context context) {
super();
mContext = context;
mImageViewLayoutParams = new GridView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
// Calculate ActionBar height
TypedValue tv = new TypedValue();
if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
mActionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics());
}
}
@Override
public int getCount() {
// If columns have yet to be determined, return no items
if (getNumColumns() == 0) {
return 0;
}
// Size + number of columns for top empty row
return Images.imageThumbUrls.length + mNumColumns;
}
@Override
public Object getItem(int position) {
return position < mNumColumns ?
null : Images.imageThumbUrls[position - mNumColumns];
}
@Override
public long getItemId(int position) {
return position < mNumColumns ? 0 : position - mNumColumns;
}
@Override
public int getViewTypeCount() {
// Two types of views, the normal ImageView and the top row of empty views
return 2;
}
@Override
public int getItemViewType(int position) {
return (position < mNumColumns) ? 1 : 0;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getView(int position, View convertView, ViewGroup container) {
// First check if this is the top row
if (position < mNumColumns) {
if (convertView == null) {
convertView = new View(mContext);
}
// Set empty view with height of ActionBar
convertView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, mActionBarHeight));
//
// THE PROBLEM IS HERE !!
//
return convertView;
}
// Now handle the main ImageView thumbnails
ImageView imageView;
if (convertView == null) { // if it's not recycled, instantiate and initialize
imageView = new RecyclingImageView(mContext);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setLayoutParams(mImageViewLayoutParams);
} else { // Otherwise re-use the converted view
imageView = (ImageView) convertView;
}
// Check the height matches our calculated column width
if (imageView.getLayoutParams().height != mItemHeight) {
imageView.setLayoutParams(mImageViewLayoutParams);
}
// Finally load the image asynchronously into the ImageView, this also takes care of
// setting a placeholder image while the background thread runs
mImageFetcher.loadImage(Images.imageThumbUrls[position - mNumColumns], imageView, false);
return imageView;
}
/**
* Sets the item height. Useful for when we know the column width so the height can be set
* to match.
*
* @param height
*/
public void setItemHeight(int height) {
if (height == mItemHeight) {
return;
}
mItemHeight = height;
mImageViewLayoutParams = new GridView.LayoutParams(LayoutParams.MATCH_PARENT, mItemHeight);
mImageFetcher.setImageSize(height);
notifyDataSetChanged();
}
public void setNumColumns(int numColumns) {
mNumColumns = numColumns;
}
public int getNumColumns() {
return mNumColumns;
}
}
在中间查看,在公共视图中查看getView():Bitmapfun项目添加一个高度等于ActionBar高度的空视图(因为动作栏在Bitmapfun原始项目中可见)。
如果我们评论这一行(或者如果我们在公共ImageAdapter()中将mActionBarHeight设为0),我们在第一张照片之前就没有这个空间。
感谢Tim Castelijns。!