Gridview(Android)底部的按钮

时间:2012-07-21 16:43:15

标签: android layout button gridview

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

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

如何在XML中获取此信息?到目前为止我尝试过的解决方案最终要么:

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

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

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

(你几乎可以想到gridview在按钮所在的底部有一个额外的行)

更新7/23:

这是当前的迭代。在onMeasure中调用时,mButton.getMeasuredHeight()为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());
  }
}

1 个答案:

答案 0 :(得分:0)

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

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

如果此方法有效,则无需覆盖onMeasure方法,否则您必须将按钮高度添加到heightMeasureSpec中的onMeasure

更新

首先调用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