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" />