列表视图项目原因列表选择器中的工具栏被禁用

时间:2015-03-17 17:13:14

标签: android listview android-listview

我有一个自定义项目的列表视图,如下所示:

 <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"来解决

2 个答案:

答案 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>

以下是来自Cabinet Beta的另一个例子:

** 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();

https://github.com/kshark27/cabinet/blob/6763d6bdf6471da98e2d8ae1a4d60ed4e3a6dbe2/app/src/main/java/com/afollestad/cabinet/adapters/FileAdapter.java

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

的Google Play图片

PopupMenu on GooglePlay

来源: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>