【问题标题】:Button at bottom of Gridview (Android)Gridview 底部的按钮 (Android)
【发布时间】:2012-07-20 14:18:30
【问题描述】:

有很多类似的问题,但大多数都是用不清楚的英语写的或者没有不完整的解决方案,所以让我试着准确地说一下我想要的行为:

用户看到一个 GridView。如果 GridView 中的项目足够大,以至于用户必须滚动才能看到更多的 gridview,那么用户最初应该看不到任何按钮。当用户滚动并到达 gridview 的底部时,他应该会看到一个可以点击的按钮。

我怎样才能在 XML 中得到它?到目前为止,我尝试过的解决方案都是:

1) 将按钮覆盖在视口底部的gridview 顶部。该按钮始终可见。

2) 创建一个显示按钮的“页脚栏”。该按钮始终可见。

这些都不是我想要的,因为在用户滚动到 gridview 的底部之前,按钮不应该是可见的。

(您几乎可以认为gridview 在按钮所在的底部有一个额外的行)

7/23 更新:

这是当前的迭代。 mButton.getMeasuredHeight() 在 onMeasure 中调用时为 0。尝试在 init() 中使用 setWidth() / setHeight() 设置宽度或高度不会改变这一点。我需要在哪里设置按钮的宽度/高度?

另请注意,应用程序随后会在网格加载后立即崩溃。不知道为什么。

public class MyGridView extends GridView {

  private Button mButton;

  public MyGridView(Context context) {
    super(context);
    init(context);
  }

  public MyGridView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
  }

  public MyGridView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context);
  }

  private void init(Context context) {
    mButton = new Button(context);
    mButton.setText("test test test");
  }

  @Override
  protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);

    int buttonLeft = left;
    int buttonTop = top + this.getMeasuredHeight();
    int buttonRight = left + mButton.getMeasuredWidth();
    int buttonBottom = bottom + getMeasuredHeight() + mButton.getMeasuredHeight();

    mButton.layout(buttonLeft, buttonTop, buttonRight, buttonBottom);
  }


  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
    int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
    this.setMeasuredDimension(parentWidth, parentHeight + mButton.getMeasuredHeight());
  }
}

【问题讨论】:

  • 我不认为你可以用 GridView 做到这一点,但你可以用 ListView 让它工作。
  • 简短的回答是你不能不修改/扩展 GridView。

标签: android layout button gridview


【解决方案1】:

一种解决方案是扩展GridView 并覆盖layoutmeasure 方法。

void layout(int l, int t, int r, int b) {
  super.layout(...);
  /* layout your button here.. */
}

如果可行,则无需重写onMeasure 方法,否则您必须在onMeasure 中将按钮高度添加到heightMeasureSpec

更新:

首先调用 super.onMeasure,然后设置测量尺寸.. 这应该可以工作..

@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{ 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

     int parentWidth = MeasureSpec.getSize(widthMeasureSpec) ; 
     int parentHeight = MeasureSpec.getSize(heightMeasureSpec ); 
     this.setMeasuredDimension(parentWidth , 
                               parentHeight + mbutton.getmeasuredheight());

 }

更新 2:

对 init 进行更改:

  private void init(Context context) {
    mButton = new Button(context);
    mButton.setLayoutParams(
                  new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, 50));
    mButton.setText("test test test");
  }

int buttonBottom = bottom  + mButton.getMeasuredHeight();

将以下方法添加到您的 Gridview 类中。

public void addButton() {
    addView(mButton);
}

在将适配器设置为网格视图后立即调用addButton

【讨论】:

  • 出现错误:“Scollview 只能承载一个直接子级” 尝试将 GridView 和 Button 包装在线性布局中,但没有成功。gridview 变得不可滚动且按钮仍位于底部页面,始终可见。
  • 我正在尝试尝试,但我实际上并不知道如何“布局我的按钮”。你能说得更具体点吗?
  • 我使用自定义视图尝试编辑了我的原始帖子。你能看看并告诉我为什么我得到空指针异常吗?
  • 永远不要将 GridView 或 ListView 放在 ScrollView 中。请。这对性能来说很糟糕,对用户体验来说也很糟糕。
  • 您甚至可以尝试从适配器添加按钮...将虚拟项目添加到数据列表..然后在 getview 中调用最后一个位置...创建一个按钮,设置参数,重力和退货...
猜你喜欢
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
相关资源
最近更新 更多