Android:根据ListView

时间:2015-11-19 06:47:28

标签: java android android-listview android-menu

我的活动中有一个ListView。我还有一个菜单,还有一个用于保存列表的menuitem。我想让它的行为类似于下面的伪代码:

if (myList.size() > 0) {
    menuitem.setVisible(true);
} else {
    menuitem.setVisible(false);
}

我希望只有列表视图中至少有一个项目才能显示“保存”菜单项。我也有自定义ArrayAdapter实现,可以从那里做出这个动作吗?或者我可以使用任何类型的倾听者吗?

感谢任何帮助!

修改

JDev答案是解决方案。 我只更改了一件事:我将列表大小检查移动到我的自定义ArrayAdapter中的notifyDataSetChanged()方法,现在它可以工作了!

     /**
     * {@inheritDoc}
     */
    @Override
    public void notifyDataSetChanged() {

        // Hide/show 'save' menuitem
        if (mListItems.size() > 0) {
           mListener.setMenuItemVisible(true);
        } else {
           mListener.setMenuItemVisible(false);
        }

        super.notifyDataSetChanged();
     }

3 个答案:

答案 0 :(得分:3)

获得ListView长度后。添加invalidateOptionsMenu();即可致电onCreateOptionsMenu()

检查ListView是否为空,

@Override 
public boolean onCreateOptionsMenu(Menu menu)
{ 
    ...
    MenuItem menuitem = menu.findItem(R.id.addAction);
    if (myList.size() > 0) {
        menuitem.setVisible(true);
    } else {
        menuitem.setVisible(false);
    }
}

如果您有任何疑问,请在下面进行评论。

答案 1 :(得分:1)

在自定义数组适配器中,您可以执行以下操作:

<强> CustomArrayAdapter.java

public interface MenuListener {
    void setMenuItemVisible(boolean state);
}

private MenuListener mListener;
private Item[] mListItems; // The list of items that your adapter handles

public void setMenuListener(MenuListener listener) {
    mListener = listener;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ListView listview = convertView.findViewById(R.id.yourListViewId);
    if (mListItems.size() > 0) {
        mListener.setMenuItemVisible(true);
    } else {
        mListener.setMenuItemVisible(false);
    }

}

<强> Activity.java:

public class Activity implements CustomArrayAdapter.MenuListener {

    private MenuItem menuItem; // The menu item that you wanna show/hide

    ....

    @Override
    public void onCreate(Bundle savedInstanceState) {

        CustomArrayAdapter adapter = new CustomArrayAdapter(params...);
        adapter.setMenuListener(this);
        // Set listView adapter
    }

    @Override 
    public boolean onCreateOptionsMenu(Menu menu)
    { 
        menuItem = menu.findItem(R.id.menuItemId); // Save the menu item that you want to show/hide later
        ...
    }

    @Override
    public void setMenuItemVisible(boolean state) {
        menuItem.setVisible(state);
    }
}

答案 2 :(得分:1)

您不必为这样简单的事情实现侦听器或其他复杂的方法。在您的Activity中,只需添加一行(在您获取要传递给适配器的数组之后):

menuitem.setVisible(array!= null && array.length() > 0 ? true: false);
// array.length() / array.length / array.size() -- whichever is suitable

编辑:如果您允许用户在列表中添加/删除,请忽略上面的单行。您可以简单地将Activity作为参数包含在适配器的构造函数中。在您的活动中,添加一个公共方法,例如:

public void showHideMenuItem(int size) {
    menuitem.setVisible(size > 0 ? true: false);
}

在适配器中,从允许添加/删除项目的任何地方调用上述方法:

activity.showHideMenuItem(items.getCount());

要初始设置menuitem的可见性,请调用:

showHideMenuItem(0); // from your Activity's onCreate(), or
activity.showHideMenuItem(0); // from your adapter's constructor

如果你通过听众等解决了这个问题并且你对此感到满意,那没关系,如果没有必要,我个人不会复杂化。我还希望通过适配器所持数组的大小与列表视图中的项目数来确定menuitem的可见性。