我有一个带有操作栏的MainActivity类和一个名为delete的菜单项。 此活动加载ListFragment类以使用单个游标适配器显示消息。
如果列表视图中没有消息或者用户删除了所有消息(因此,ListView中没有消息),我想隐藏删除菜单项。
我在ListFragment类上实现了一个接口,我在MainActivity上处理它。它运作良好,但我有一些疑问。
我在ViewBinder中使用了cursor.getCount()来检查ListView是否为空。
有更好的方法吗?
我在setViewBinder中调用cursor.getCount()是一个很大的开销---> ViewBinder?
先谢谢,Luiz
public class MainActivity extends Activity implements MyListFragment.OnCountItemsListener{
private boolean menu_del_visible=false;
public void OnCountItemsChanged(boolean changed){
menu_del_visible=changed;
invalidateOptionsMenu();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
menu.findItem(R.id.action_del).setVisible(menu_del_visible);
return true;
}
////
public class MyListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
public interface OnCountItemsListener {
public void OnCountItemsChanged(boolean changed);
}
private OnCountItemsListener mListener;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnCountItemsListener)activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()+
"must implement OnCountItemsListener");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
now = new Date();
adapter = new SimpleCursorAdapter(getActivity(),
R.layout.msg_list_item,
null,
new String[]{DataProvider.COL_MSG, DataProvider.COL_AT},
new int[]{R.id.text1, R.id.text2},
0);
adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
//send callback to MainActivity to hide delete menuitem
mListener.OnCountItemsChanged(cursor.getCount()==0?false:true);
switch (view.getId()) {
.........
..........
}
////
答案 0 :(得分:0)
首先:为菜单创建一个变量:
private Menu menu;
第二:对变量进行初始化:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
getMenuInflater().inflate(R.menu.menu.main, menu);
return true;
}
第三:创建一个布尔值,当listView不为空时,该布尔值为真。
第四:无论你将值更改为该布尔变量,都可以调用invalidateOptionsMenu()
和onPrepareOptionsMenu(menu)
。
第五:你覆盖onPrepareOptionsMenu,使你在布尔条件为假时隐藏你要隐藏的项目:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem delete = menu.findItem(R.id.action_del);
delete.setVisible(menu_del_visible);
return true;
}