【问题标题】:Android Gridview not showing view at position 0 wellAndroid Gridview 没有很好地显示位置 0 的视图
【发布时间】:2014-03-30 20:32:41
【问题描述】:

我是 android 开发的新手,我在GridView 方面遇到了一点困难。我在第一堂课中有一个Gridview,名为Game,我添加了一个名为GameAdapterBaseAdapter。代码运行良好,但在将视图添加到 GridView 时,它不显示第一个元素(位置 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);
    } 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;
}

假设:mContext是Game类的Context,cols和raw是Game类中的静态整数,分别代表行数,gv是Game中实际的GridViewGame.splittedBitmaps[]是包含要设置为背景的位图的数组。

这是我的getView() 代码。请注意,当我有行代码时:

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

结果如下:

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.setHeight(Game.gv.getMeasuredHeight() / Game.rows);

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

postimg.org/image/ubv5qwr4z/

我只想在位置 0 获取与其他尺寸相同的图片。

编辑:

我正在使用的网格视图的 XML:

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

这是关于 Game 类中网格视图的代码:

gv = (GridView) findViewById(R.id.gvGame);
gv.setNumColumns(cols);
gv.setAdapter(new GameAdapter(getApplicationContext()));

【问题讨论】:

  • 您是否在代码中添加了日志记录(打印)语句,以确保在所有情况下都处理 0 案例?另外,您的 GridView 设置代码是什么样的?您也可以尝试使用更简单的LayoutParams.FILL_PARENT,这样您就不必自己定义大小,您应该在创建 GridView 时定义行和列的宽度和高度,因此填充父参数 @987654344 @ 在这种情况下工作。
  • trumpetlicks .. 实际上,当我根据扫描的列数和行数剪切图片时,我没有恒定的视图宽度和高度。所以每个的宽度取决于网格视图的宽度/列数,高度也取决于网格视图的高度/行数。

标签: android android-layout gridview android-gridview


【解决方案1】:

我很确定您希望您的代码如下所示,无论这是否真正回答了您的问题。

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;
}

【讨论】:

  • 是的,我认为你是对的,这是一个小错误。我修复了它,但问题仍然是一样的。再次提醒您,列数和行数是动态变化的(不是恒定的),否则,我会使用 xml 文件中的 GridView 定义它们。我编辑了问题(在 xml 中添加了网格视图代码以及我在 Game 类中实例化它的方式)。谢谢
  • @user3396919 - 我的意思不是在 xml 文件中静态定义它们。我的意思是在代码中动态定义它们,但是使用标准的 GridView API 定义它们,然后允许按钮在 gridview 范围内调整自身的大小。
【解决方案2】:

相当老的帖子,但如果有人遇到同样的问题,这是可能的原因和解决方案:

您可能在片段/活动的创建周期(onCreate、onStart 等)中设置适配器及其列表,因此当您的适配器内完成第一个视图创建时,尚未绘制 GridView 并且具有宽度为 0。

这不会发生在其他创建的视图上,可能是因为第一个视图的创建迫使 GridView 被绘制。

您可以在该帖子中找到一堆解决方案:https://stackoverflow.com/a/24035591/3495069

我个人最终使用了 post 方法:

    mGridView.post(new Runnable() {
        @Override
        public void run() {
            mGridView.setAdapter(mAdapter);
        }
    });

【讨论】:

    【解决方案3】:

    我也有同样的问题。如果是您的代码,这就是它的样子。

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

    【讨论】:

      猜你喜欢
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多