为ListView强制onSizeChanged

时间:2011-05-26 15:45:41

标签: android android-layout android-listview

我有一个listview,可以动态分配不同的数据集。这很好用。我也使fastScrollEnabled成为现实。对于要更新的​​sectionIndexer,我需要调用

list.setFastScrollEnabled(false);
list.setFastScrollEnabled(true);

问题是索引显示在左上角,这是一个已知问题。作为解决方法,每当我更改方向时,都会再次正确显示索引。为了测试这个我已经实现了一个自定义ListView,观察是如果我可以强制listView调用onSizeChanged()它将正确显示。

现在的问题是:

是否可以强制listView调用onSizeChanged()方法?如果是,我们怎样才能做到这一点。

有人知道调用onSizeChanged()时的条件。当方向发生变化时,我们可以想到任何其他条件。

3 个答案:

答案 0 :(得分:7)

要在ListView上强制onSizeChanged,我会执行以下操作:

myList.getLayoutParams().height = myList.getHeight() + 1;
myList.requestLayout();

请确保每次都不要调用+1或-1,因为列表可能只是过大地指定了大小,因此使用标记在+1和-1之间切换。

答案 1 :(得分:0)

尝试:

listView.requestLayout();

答案 2 :(得分:0)

这是我的解决方案:
我用构造函数(Context,AttributeSet)子类化了GridView:
(这对我来说必须在一个单独的文件类上完成)
并覆盖onSizeChanged方法

MyGrid.java

public class MyGrid extends GridView {

  public void MyGrid(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
  }

  protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    // TODO Auto-generated method stub
    // Here I call my custom functions to prepare layout of my custom listview
    super.onSizeChanged(w, h, oldw, oldh);
  }
}

在类Activity上使用GridView,
我已经超越了启动方法
(在OnCreate之后和onRestart之后调用   [当你来自另一项活动时])

MyActivity.java

public class MyActivity extends Activity {

  onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(...)
    ...
  }
  ....

  protected void onStart() {
    // TODO Auto-generated method stub

    // call db and create cursor
    // 'mygridview' = findbyid MyGrid
    // (declared on xml like '<packagepath>'.mygrid

    // setadapter with my costom adapeter       

    // **HERE THE CALLED ONSIZECHANGED**
    // I make test proper for my app
    // (there is a simple test)
    if ('mygridview'.getMeasuredHeight() > 0) {
      // I use the same width and height for new and old measures
      // because for me that is right
      'mygridview'.onSizeChanged(gw.getWidth(), gw.getHeight(), 
                       gw.getWidth(), gw.getHeight());
    }
    super.onStart();
  }
}

通过这种方法,我可以随时调整网格大小。 我希望你能提供帮助。