我正在努力实现以下用户体验:当我的ListFragment适配器中有更多可以在屏幕上显示的项目时,我想在ActionBar中显示搜索操作,但是在那里少了,然后是Add Item动作。
我面临两个问题:
我正在尝试在onCreateOptionsMenu中计算项目数量少于或多于屏幕上显示的数量,但在该阶段,ListView始终为空。我应该在哪里移动该计算,如何从其他方法设置菜单操作?
当我在我的代码中使用menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)时,它确实具有不在ActionBar中显示它的效果,但是当我在MenuOverflow中单击它时,它没有&#t; t一切都行动。
我使用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);
}
答案 0 :(得分: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);
}
试试这个:
select t1.ID, t1.Name, t1.Sex, t2.OrderDate, t2.OrderCode from
Table1 t1
inner join Table2 t2 on t1.ID = t2.ID;