我有一个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 未被选中?每当我使用该布局单击任何项目时,都不会进行选择,甚至不会打印出调试信息。
答案 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项目选择无法发生此文本视图。