Android listview项目原因列表选择器中的工具栏处于禁用状态
我有一个自定义项的列表视图,如下所示:Android listview项目原因列表选择器中的工具栏处于禁用状态,android,listview,android-listview,Android,Listview,Android Listview,我有一个自定义项的列表视图,如下所示: <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_gravity="bottom"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_gravity="bottom"
android:id="@+id/tvProfileName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="@color/black"
android:textStyle="bold" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolBar"
android:layout_gravity="top"
android:gravity="top"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
一切正常,除了背景选择器项不工作。尽管我使用了android:listSelector
或使用了default,但什么也没发生。问题是,当我从列表项中删除工具栏(或使其可见性消失)时,选择器工作正常。我不知道为什么会这样。有什么想法吗
更新:我的问题通过在根项目列表视图中使用android:degenantfocusability=“blocksDescendants”
来解决将android:focusability=“false”放在列表项目的xml条目中,如<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_gravity="bottom"
android:id="@+id/tvProfileName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="@color/black"
android:textStyle="bold" />
<android.support.v7.widget.Toolbar
android:id="@+id/toolBar"
android:layout_gravity="top"
android:gravity="top"
android:focusable="false"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
您正在寻找的被称为
弹出式菜单
:
请看下面的例子。您需要在列表视图
项的XML中为弹出菜单
创建一个按钮
。在本例中,他们在活动中使用onCreate()
private Button btnFilter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Locate filter button and attach click listener
btnFilter = (Button) findViewById(R.id.btnFilter);
btnFilter.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showFilterPopup(v);
}
});
// ...
}
显示弹出菜单
:
单击列表视图中的按钮
时,将显示弹出菜单
:
private void showFilterPopup(View v) {
PopupMenu popup = new PopupMenu(this, v);
// Inflate the menu from xml
popup.getMenuInflater().inflate(R.menu.popup_filter, popup.getMenu());
// Setup menu item selection
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_keyword:
Toast.makeText(MainActivity.this, "Keyword!", Toast.LENGTH_SHORT).show();
return true;
case R.id.menu_popularity:
Toast.makeText(MainActivity.this, "Popularity!", Toast.LENGTH_SHORT).show();
return true;
default:
return false;
}
}
});
// Handle dismissal with: popup.setOnDismissListener(...);
// Show the menu
popup.show();
}
菜单XML:
将充气的示例菜单:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_keyword"
android:title="Keyword" />
<item android:id="@+id/menu_popularity"
android:title="Popularity" />
</menu>
在“弹出菜单
XML”:
下面是Google Play使用弹出菜单的图片:
资料来源:
文档:为什么要在列表视图项中放置工具栏?你想模仿弹出菜单吗?请看我的答案。我知道这个。实际上它可以用作工具栏,但我的问题是工具栏是列表视图项上的连接单击事件,所以我使用android:genderantFocusability=“blocksDescendants”作为根项,它工作得很好。当我使用列表项中的按钮或imageview显示菜单时,弹出菜单的行为与此相同。所以,问题是,在这种情况下,为什么我应该使用弹出菜单而不是工具栏?为什么要为每个ListView
行膨胀整个操作栏/工具栏?这是对资源的浪费。我使用视图保持器模式,所以我不会为每一行充气(只要在convert view为null时获得工具栏视图充气)。但你是对的,弹出菜单可能是正确的方式,因为工具栏是用来取代动作栏的。当视图为空时,视图保持架模式会膨胀。我明白你想说什么。如果你需要更多的帮助,请告诉我。那些Github链接将有你需要的“溢出”图标。我做到了。谢谢你的帮助。
private void showFilterPopup(View v) {
PopupMenu popup = new PopupMenu(this, v);
// Inflate the menu from xml
popup.getMenuInflater().inflate(R.menu.popup_filter, popup.getMenu());
// Setup menu item selection
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_keyword:
Toast.makeText(MainActivity.this, "Keyword!", Toast.LENGTH_SHORT).show();
return true;
case R.id.menu_popularity:
Toast.makeText(MainActivity.this, "Popularity!", Toast.LENGTH_SHORT).show();
return true;
default:
return false;
}
}
});
// Handle dismissal with: popup.setOnDismissListener(...);
// Show the menu
popup.show();
}
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_keyword"
android:title="Keyword" />
<item android:id="@+id/menu_popularity"
android:title="Popularity" />
</menu>
PopupMenu mPopupMenu = new PopupMenu(context, view);
mPopupMenu.inflate(file.isDirectory() ? R.menu.dir_options : R.menu.file_options);
boolean foundInCopyCab = false;
boolean foundInCutCab = false;
DrawerActivity act = (DrawerActivity) mContext;
if (act.getCab() instanceof CopyCab) {
foundInCopyCab = ((BaseFileCab) act.getCab()).containsFile(file);
} else if (act.getCab() instanceof CutCab) {
foundInCutCab = ((BaseFileCab) act.getCab()).containsFile(file);
}
mPopupMenu.getMenu().findItem(R.id.copy).setVisible(!foundInCopyCab);
mPopupMenu.getMenu().findItem(R.id.cut).setVisible(!foundInCutCab);
if (file.isDirectory()) {
mPopupMenu.getMenu().findItem(R.id.pin).setVisible(!Pins.contains(mContext, new Pins.Item(file)));
} else {
MenuItem zip = mPopupMenu.getMenu().findItem(R.id.zip);
if (!file.isRemote()) {
zip.setVisible(true);
if (file.getExtension().equals("zip"))
zip.setTitle(R.string.unzip);
else zip.setTitle(R.string.zip);
} else zip.setVisible(false);
}
mPopupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
mMenuListener.onMenuItemClick(mFiles.get(index), menuItem);
return true;
}
});
mPopupMenu.show();
<ImageView
android:id="@+id/menu"
android:layout_width="42dp"
android:layout_height="42dp"
android:src="?overflow"
android:scaleType="fitXY"
android:layout_marginLeft="8dp"
android:layout_alignParentRight="true"
android:background="?menu_selector"
android:layout_centerVertical="true"
android:padding="8dp"
android:focusableInTouchMode="false"
android:focusable="false"
android:layout_marginRight="14dp" />