How/where在代码中检测ListFragment中的ListView是否所有item都可见?

How/where in the code to detect wether in ListFragment's ListView all items are visible?

我正在尝试根据所有列表项是否可见来更改 ActionBar 的操作(适合屏幕的项目较少 => 显示 "Add item" 操作 | 有一些项目不可见 => 显示 "Search" 动作)

为了能够使用 getListView().getLastVisiblePosition() 而不是 -1,我应该重写 ListFragment 的什么方法?

这是我的 ListFragment 中的代码,但在 onCreateOptionsMenu lv.getLastVisiblePosition() 中总是 returns -1.

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.list, menu);

    final MenuItem search = menu.findItem(R.id.menu_item_search);
    final MenuItem add = menu.findItem(R.id.menu_item_add_item);

    final ListView lv = getListView();
    if (lv.getFirstVisiblePosition() == 0 && lv.getLastVisiblePosition() == mAdapter.getCount()-1) {
        // all items visible: show add, hide search
        search.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
    } else {
        // not all items visible: show search, hide add
        add.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    }
    // ...
}

为了可见 child 计入 ListView

int visibleChildCount = (listView.getLastVisiblePosition() - listView.getFirstVisiblePosition()) + 1;

现在获取 ListView

中的总 child 计数
int totalChildCount = listView.getAdapter().getCount;

隐藏/显示操作栏图标。

if(totalChildCount>visibleChildCount){
  // Visible
}else{
  // Gone
} 

希望对您有所帮助。

getLastVisiblePosition returns 仅当适配器的项目被添加并通过软管 ListView 布置时有效位置,我不知道任何询问 ListView 的方法当它发生时,最好的选择就是在 UI 线程阻塞等待更多消息时监听:

Looper.myQueue().addIdleHandler

并在 IdleHandler#queueIdle()

中调用 getLastVisiblePosition()