我是Android开发的新手,我面临着GridView
的一个小难点。我的第一堂课中有Gridview
名为Game,我添加了一个名为BaseAdapter
的{{1}}。代码工作正常,但在将视图添加到GameAdapter
时,它不会显示第一个元素(位置0)。
GridView
假设:public View getView(int position, View convertView, ViewGroup parent) {
Button b;
if (convertView == null) {
b = new Button(mContext);
b.setLayoutParams(new GridView.LayoutParams(parent.getWidth() / (Game.cols), parent.getHeight() / (Game.rows + 1)));
//b.setHeight(Game.gv.getMeasuredHeight() / Game.rows);
} else {
b = (Button) convertView;
}
Drawable d = new BitmapDrawable(Game.splittedBitmaps[position]);
b.setBackground(d);
b.setId(position);
b.setTag("Image_" + position);
b.setOnClickListener(Game.s);
Game.buttons[position] = b;
return b;
}
是Game类的Context,cols和raw是Game类中的静态整数,分别表示数字go列和行,mContext
是实际的gv
in游戏GridView
是一个包含要设置为背景的位图的数组。
所以这是我的Game.splittedBitmaps[]
代码。请注意,当我有行代码时:
getView()
这将是结果:
http://postimg.org/image/794mrqpnn/
注意位置0处缺少的视图。
在我的其他运行中,删除了行代码后:
b.setLayoutParams(new GridView.LayoutParams(parent.getWidth() / (Game.cols), parent.getHeight() / (Game.rows + 1)));
图片显示但高度缩小了。
http://postimg.org/image/nmomaw5sz/
当我添加行代码时:
b.setLayoutParams(new GridView.LayoutParams(parent.getWidth() / (Game.cols), parent.getHeight() / (Game.rows + 1)));
结果变为结果1和结果2之间的一半:
postimg.org/image/ubv5qwr4z /
我只是想让位置0的图片与其他图片的尺寸相同。
网格视图的XML我使用:
b.setHeight(Game.gv.getMeasuredHeight() / Game.rows);
这是关于Game类中网格视图的代码:
<GridView
android:id="@+id/gvGame"
android:layout_width="fill_parent"
android:layout_height="375dp"
android:gravity="center"
android:horizontalSpacing="3dp"
android:padding="3dp"
android:stretchMode="columnWidth"
android:verticalSpacing="1dp" />
答案 0 :(得分:0)
我非常确定您希望您的代码看起来如下,无论这是否真正回答了您的问题。
public View getView(int position, View convertView, ViewGroup parent) {
Button b;
if (convertView == null) {
b = new Button(mContext);
b.setLayoutParams(new GridView.LayoutParams(parent.getWidth() / (Game.cols), parent.getHeight() / (Game.rows + 1)));
//b.setHeight(Game.gv.getMeasuredHeight() / Game.rows);
// This code from below SHOULDNT need to be done if the view already exists
// Im also assuming that the drawable WILL NOT change, if it does, the 2
// lines below may move outside this if statement
Drawable d = new BitmapDrawable(Game.splittedBitmaps[position]);
b.setBackground(d);
b.setId(position);
b.setTag("Image_" + position);
b.setOnClickListener(Game.s);
Game.buttons[position] = b;
} else {
b = (Button) convertView;
}
return b;
}
答案 1 :(得分:0)
相当古老的帖子,但如果有人得到同样的问题,这里有可能的原因和解决方案:
您可能正在片段/活动(onCreate,onStart等)的创建周期中设置适配器及其列表,因此当您在适配器内完成第一个视图创建时,GridView尚未绘制并具有宽度为0.
其他创建的视图不会发生这种情况可能是因为创建第一个视图会强制绘制GridView。
您可以在该帖子上找到一堆解决方案:https://stackoverflow.com/a/24035591/3495069
我个人最终得到了post方法:
mGridView.post(new Runnable() {
@Override
public void run() {
mGridView.setAdapter(mAdapter);
}
});
答案 2 :(得分:0)
我也有同样的问题。如果它是您的代码,那就是它的样子。
if (convertView == null) {
b = new Button(mContext);
b.setLayoutParams(new GridView.LayoutParams(parent.getWidth() / (Game.cols), parent.getHeight() / (Game.rows + 1)));
//b.setHeight(Game.gv.getMeasuredHeight() / Game.rows);
} else {
b = (Button) convertView;
if (b.getHeight() == 0)
b.setLayoutParams(new GridView.LayoutParams(parent.getWidth() / (Game.cols), parent.getHeight() / (Game.rows + 1)));
}