Принудительно onSizeChanged для ListView - PullRequest
7 голосов
/ 26 мая 2011

У меня есть список, который динамически присваивается различным наборам данных.Это отлично работает.Я также сделал fastScrollEnabled, чтобы быть правдой.Для обновления sectionIndexer мне нужно позвонить

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

Проблема в том, что индекс отображается в верхнем левом углу, и это известная проблема.В качестве обходного пути, когда я меняю ориентацию, индекс снова отображается правильно.Чтобы проверить это, я реализовал собственный ListView, и наблюдение состоит в том, что если я смогу заставить listView вызвать onSizeChanged (), он будет отображаться правильно.

Теперь вопрос:

Можно ли принудительно вызватьlistView для вызова метода onSizeChanged ()?Если да, как мы можем это сделать.

Кто-нибудь знает об условиях, когда вызывается onSizeChanged ().Он определенно вызывается, когда меняется ориентация, любые другие условия, которые мы можем придумать.

Ответы [ 3 ]

7 голосов
/ 30 мая 2011

Чтобы вызвать onSizeChanged в ListView, я делаю следующее:

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

Просто не вызывайте +1 или -1 каждый раз, поскольку список может просто переопределить указанный размер и, следовательно, использовать флаг для переключенияот +1 до -1.

0 голосов
/ 17 июня 2011

Это мое решение:
Я подкласс GridView с конструктором (Context, AttributeSet):
(это для меня должно быть сделано в отдельном классе файлов)
и переопределил метод 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,
Я переопределил метод onStart
(вызывается после 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();
  }
}

При таком подходе я могу изменить размер моей сетки в любое время. Я надеюсь, что это вам полезно.

0 голосов
/ 26 мая 2011

Попробуйте с:

listView.requestLayout();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...