我的活动中有一个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();
}
答案 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的可见性。