我有一个自定义项目的列表视图,如下所示:
<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>
这是listview
<ListView
android:id="@+id/lvProfile"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@color/list_line"
android:dividerHeight="1dp"
android:listSelector="@drawable/list_selector"/>
和适配器
public View getView(int position, View convertView, ViewGroup parent) {
// use viewholder etc..
viewHolder.toolBar.inflateMenu(R.menu.menu_profile_item);
objHolder.toolBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
return false;
}
});
}
除了后台选择器项不起作用外,一切都很好。虽然我使用android:listSelector
或使用默认值,但没有任何反应。问题是当我从列表项中删除工具栏(或使其可见性消失)时,选择器运行良好。我不知道为什么会这样。有什么想法吗?
更新:我的问题通过在根项目列表视图中使用android:descendantFocusability="blocksDescendants"
来解决
答案 0 :(得分:2)
您要找的是PopupMenu
:
请查看以下示例。您需要在Button
项的XML中为PopupMenu
创建ListView
。在此示例中,他们在onCreate()
中使用Activity
。
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);
}
});
// ...
}
显示PopupMenu
:
当您点击Button
中的ListView
时,会显示PopupMenu
:
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>
** PopupMenu
中的“Adapter
”:
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();
“PopupMenu
XML”:
https://github.com/kshark27/cabinet/blob/master/app/src/main/res/layout/list_item_file.xml
<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" />
PopupMenu
来源:https://github.com/codepath/android_guides/wiki/Menus-and-Popups#popup-menu 文档:https://developer.android.com/reference/android/support/v7/widget/PopupMenu.html
答案 1 :(得分:0)
把android:focusable =&#34; false&#34;在列表项的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>