在ListFragment的ListView中如何/在哪里检测所有项目是否可见?

时间:2016-03-17 08:30:48

标签: android listview android-listfragment

我正在尝试更改ActionBar的操作,具体取决于所有列表项是否可见(适用于屏幕的项目较少=>显示“添加项目”操作|有些项目不可见=>显示“搜索”动作)

我应该覆盖哪种ListFragment方法才能使用getListView()。getLastVisiblePosition()并且得不到-1?

这是我的ListFragment中的代码,但在onCreateOptionsMenu中,lv.getLastVisiblePosition()始终返回-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);
    }
    // ...
}

2 个答案:

答案 0 :(得分:1)

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

  

Looper.myQueue()。addIdleHandler

并在getLastVisiblePosition()

内拨打IdleHandler#queueIdle()

答案 1 :(得分:0)

要在ListView中获得可见的子计数。

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

现在获得ListView中的总儿童数,

int totalChildCount = listView.getAdapter().getCount;

隐藏/显示操作栏图标。

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

希望这会对你有所帮助。