根据ListFragment

时间:2016-03-17 07:04:44

标签: android android-actionbar menuitem android-listfragment

我正在努力实现以下用户体验:当我的ListFragment适配器中有更多可以在屏幕上显示的项目时,我想在ActionBar中显示搜索操作,但是在那里少了,然后是Add Item动作。

我面临两个问题:

  1. 我正在尝试在onCreateOptionsMenu中计算项目数量少于或多于屏幕上显示的数量,但在该阶段,ListView始终为空。我应该在哪里移动该计算,如何从其他方法设置菜单操作?

  2. 当我在我的代码中使用menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)时,它确实具有不在ActionBar中显示它的效果,但是当我在MenuOverflow中单击它时,它没有&#t; t一切都行动。

  3. 我使用minSdkVersion 15而没有兼容性或支持库。

    RES /菜单/ list.xml:

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context="com.fletech.android.opensesame.key.KeyringActivity" >
        <item android:id="@+id/menu_item_add_item"
            android:orderInCategory="100"
            android:showAsAction="always"
            android:icon="@android:drawable/ic_menu_add"
            android:title="Add key" />
        <item android:id="@+id/menu_item_search"
            android:orderInCategory="200"
            android:showAsAction="ifRoom|collapseActionView"
            android:icon="@android:drawable/ic_menu_search"
            android:title="Search"
            android:actionViewClass="com.fletech.android.opensesame.app.CursorFragment$MySearchView"/>
    
        <!-- I have more menu items here -->
    
    </menu>
    

    代码:

    @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);
        mSearchView = (MySearchView)search.getActionView();
        mSearchView.setOnQueryTextListener(this);
        mSearchView.setOnCloseListener(this);
        mSearchView.setIconifiedByDefault(true);
    
        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_IF_ROOM);
        } else {
            // not all items visible: show search, hide add
            final MenuItem add = menu.findItem(R.id.menu_item_add_item);
            add.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
        }
    }
    

    更新:第二个问题是通过将mSearchView行移到setShowAsAction()调用之后解决的:

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.list, menu);
    
        SendInvitationActivity.onCreateShareOptionsMenu(getActivity(), menu, R.id.menu_item_share);
    
        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);
        }
    
        mSearchView = (MySearchView)search.getActionView();
        mSearchView.setOnQueryTextListener(this);
        mSearchView.setOnCloseListener(this);
        mSearchView.setIconifiedByDefault(true);
    }
    

1 个答案:

答案 0 :(得分:1)

  1. 当适配器项目发生变化(添加/删除)时,您需要检查显示的项目数量,然后如果您想再次呼叫 onCreateOptionsMenu ,请致电:

     final MenuItem add = menu.findItem(R.id.menu_item_add_item);
     final MenuItem search = menu.findItem(R.id.menu_item_search_item);
     int numberItemsVisible = lv.getLastVisiblePosition() - lv.getFirstVisiblePosition() + 1;
     if (numberItemsVisible == mAdapter.getCount()) {
         // all items visible: show add, hide search
         add.setShowAsAction(MenuItem.ALWAYS);
         search.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
         // or search.setShowAsAction(MenuItem.NEVER);
     } else {
         // not all items visible: show search, hide add
         add.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
         // or add.setShowAsAction(MenuItem.NEVER);
         search.setShowAsAction(MenuItem.ALWAYS);
     }
    
  2. 试试这个:

    select t1.ID, t1.Name, t1.Sex, t2.OrderDate, t2.OrderCode from 
    Table1 t1
    inner join Table2 t2 on t1.ID = t2.ID;