如果Android ListFragment中的Listview为空,则在MainActivity中隐藏menuitem

时间:2015-06-24 15:40:18

标签: android android-fragments menuitem android-listfragment

我有一个带有操作栏的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()) {
.........
..........
}

////

1 个答案:

答案 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;
}