Android Gridview没有显示位置0的视图

时间:2014-03-30 20:32:42

标签: android android-layout gridview android-gridview

我是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()

这将是结果:

enter image description here

http://postimg.org/image/794mrqpnn/

注意位置0处缺少的视图。

在我的其他运行中,删除了行代码后:

b.setLayoutParams(new GridView.LayoutParams(parent.getWidth() / (Game.cols), parent.getHeight() / (Game.rows + 1)));

图片显示但高度缩小了。

enter image description here

http://postimg.org/image/nmomaw5sz/

当我添加行代码时:

b.setLayoutParams(new GridView.LayoutParams(parent.getWidth() / (Game.cols), parent.getHeight() / (Game.rows + 1)));

结果变为结果1和结果2之间的一半:

enter image description here

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" />

3 个答案:

答案 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)));
}