【问题标题】:How/where in the code to detect wether in ListFragment's ListView all items are visible?如何/在代码中的何处检测 ListFragment ListView 中的所有项目是否可见?
【发布时间】:2016-03-17 17:16:29
【问题描述】:

我正在尝试根据所有列表项是否可见来更改 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);
    }
    // ...
}

【问题讨论】:

  • 尝试Looper.myQueue().addIdleHandler并在IdleHandler内调用getLastVisiblePosition
  • @pskink,我尝试将它添加到 onActivityCreated 中,它可以工作,但是:如果我返回 true,即使没有任何更改或移动,它也会一次又一次地被调用,如果我返回false 它只工作一次
  • 你希望它被调用一次,不是吗?如果不是,则每次适配器大小更改时返回“false”和addIdleHandler
  • @pskink 有效,我将它添加到我的适配器的 notifyDataSetChanged。如果您将其添加为答案,我会接受它

标签: android listview android-listfragment


【解决方案1】:

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

Looper.myQueue().addIdleHandler

并在IdleHandler#queueIdle() 内调用getLastVisiblePosition()

【讨论】:

【解决方案2】:

ListView 中获取可见的子项计数。

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

现在获取ListView 中的总孩子数,

int totalChildCount = listView.getAdapter().getCount;

隐藏/显示操作栏图标。

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

希望这会对你有所帮助。

【讨论】:

  • 不,不幸的是我已经知道这一点,甚至在我的问题的代码中。我的问题是我可以重写 ListFragment 的什么方法以便在 getLastVisiblePosition() 中获得真实结果,因为我尝试过的任何地方(除了列表项的 onclick,只是为了验证计算是否正确)我得到 -1,因为列表尚未填充
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
相关资源
最近更新 更多