为什么有些listview项目没有被选中?

时间:2016-03-16 11:08:20

标签: android android-layout listview

我有一个listview,它使用基本适配器和两个布局来显示项目。我在这个列表视图上实现了multichoicemodelistener。

问题是当我长按listview项目时,有些是被选中而有些则没有被选中。我意识到被选中的那些正在使用与未被选中的行布局不同的行布局。

正在选择的列表视图行的布局。>>>> 布局1

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:activatedBackgroundIndicator">


<LinearLayout
    android:id="@+id/chat_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="15dp"
    android:orientation="vertical">


    <com.x.y.SquareImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="centerCrop"
        android:adjustViewBounds="true"
        android:layout_gravity="center" />

       <Textview
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#020202"
        android:textSize="17sp"
        android:textIsSelectable="false" />
</LinearLayout>

</RelativeLayout>

未被选中的列表视图行的布局&gt;&gt;&gt;&gt; 布局2

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:activatedBackgroundIndicator">


<LinearLayout
    android:id="@+id/chat_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_marginLeft="15dp">

    <Textview
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#020202"
        android:textSize="17sp"
        android:textIsSelectable="true" />
</LinearLayout>

</RelativeLayout>

我如何实现多重模式监听器

list_View.setMultiChoiceModeListener(new Selector());

选择器类

private class Selector implements AbsListView.MultiChoiceModeListener {


    @Override
    public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {

        mode.getMenuInflater().inflate(R.menu.chat_activity_menu, menu);
        return true;
    }

    @Override
    public void onItemCheckedStateChanged(android.view.ActionMode mode, int position, long id, boolean checked) {
        int checkedCount = list_View.getCheckedItemCount();
        Log.d("Selector","checked items are "+checkedCount);
        mode.setSubtitle(checkedCount+" selected");
    }

    @Override
    public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) {

        return true;
    }

    @Override
    public void onDestroyActionMode(android.view.ActionMode mode) {
        adapter.removeSelection();
    }
}

为什么是我的一些列表视图项目使用 LAYOUT 2 未被选中?每当我使用该布局单击任何项​​目时,都不会进行选择,甚至不会打印出调试信息。

1 个答案:

答案 0 :(得分:0)

我已经意识到使用 LAYOUT 2 制作listview项目是不可取的。问题是我在布局2 中使textview的文本可以选择。

内部布局2

   <Textview
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#020202"
    android:textSize="17sp"
    android:textIsSelectable="true"
     />

我将其更改为

<Textview
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#020202"
    android:textSize="17sp"
    android:textIsSelectable="false"
     />

更改为android:textIsSelectable="false"

使用此布局的所有listview项目都可以选择。

那么为什么它会影响LISTVIEW项目选择?

根据android docs

  

调用此方法时(在Xml中android:textIsSelectable="true"   或以编程方式textview.setTextIsSelectable(true)),它设置   flag focusable,focusableInTouchMode,clickable和longClickable to   相同的价值。

这意味着如果我设置`android:textIsSelectable =&#34; true&#34;&#39;:

  • android:longClickable自动设置为 true ,并根据android docs
  

SetLongClickable为此视图启用或禁用长按事件。   当视图长时间可点击时,它会对按住该视图的用户做出反应   按钮比持续时间更长。这个事件可以启动   听众或上下文菜单。

  • android:clickable也会自动设置为 true 并根据android docs
  

setClickable启用或禁用此视图的click事件。当一个   视图是可点击的,它会将其状态更改为&#34;按下&#34;每一个   点击。

因此,longclicks和click事件被textview消耗[它们被传递到此textview]而不是listview,因此listview项目选择无法发生此文本视图。