使用simple_list_item_checked onItemLongClick的android列表视图未按预期进行



我有一个使用android.R.layout.simple_list_item_checkedListView,我想设置onItemLongClick()侦听器和onItemClick()侦听器来做不同的事情。如何使ONLY长按选中/取消选中项目,而不是(短按)?感谢

我尝试过让长点击返回false,这样它就不会消耗事件,但长点击不会选中/取消选中。只有短暂的点击才会。我还试图人为地取消短点击(注释掉代码)中的检查,但这并没有达到预期的效果。

如果我删除了短点击回调,长点击仍然不会选中/取消选中。此外,短点击将继续选中/取消选中。

编辑-让我完整地介绍代码:

package com.example.checked;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckedTextView;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ListView myListView;
ArrayList<String> myData = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myListView = (ListView) findViewById(R.id.myListView);
// test data
myData = new ArrayList<String>();
myData.add("apple");
myData.add("banana");
myData.add("cherry");
myData.add("durian");
myData.add("eggplant");
ArrayAdapter myAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_checked, myData) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
CheckedTextView ctv = (CheckedTextView) view.findViewById(android.R.id.text1);
ctv.setFocusable(false);
ctv.setText(myData.get(position));
((ListView)parent).setItemChecked(position, false);
return view;
}
};
myListView.setAdapter(myAdapter);
myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
myListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
CheckedTextView ctv = (CheckedTextView) view;
Log.i("onItemLongClick", "position=" + position + ", id=" + id + ", isChecked=" + ctv.isChecked());
// do something
return false;
}
});
myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
CheckedTextView ctv = (CheckedTextView) view;
Log.i("onItemClick", "position=" + position + ", id=" + id + ", isChecked=" + ctv.isChecked());
//if (ctv.isChecked()) ctv.setChecked(false);
//else if (!ctv.isChecked()) ctv.setChecked(true);
// do something else
}
});
}
}

以及xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.checked.MainActivity">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:weightSum="100">
<ListView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_weight="80"
android:id="@+id/myListView" />
</LinearLayout>
</RelativeLayout>

执行以下操作的日志输出:

  • 长按"apple">
  • 再次长按"苹果">
  • 短按"香蕉">
  • 再次短按"香蕉">

01-17 10:23:45.628 14928-14928/com.example.checked I/onItemLongClick: position=0, id=0, isChecked=false 01-17 10:23:46.242 14928-14928/com.example.checked I/onItemClick: position=0, id=0, isChecked=true 01-17 10:23:50.655 14928-14928/com.example.checked I/onItemLongClick: position=0, id=0, isChecked=true 01-17 10:23:51.002 14928-14928/com.example.checked I/onItemClick: position=0, id=0, isChecked=false 01-17 10:23:53.756 14928-14928/com.example.checked I/onItemClick: position=1, id=1, isChecked=true 01-17 10:23:55.131 14928-14928/com.example.checked I/onItemClick: position=1, id=1, isChecked=false

上面的意思是onItemLongClick()没有检查/取消检查项目,只有onItemLick()检查/取消选择,这与我想要的正好相反。

编辑#2-我尝试将listview xml更改为以下内容,同时保持java代码不变:

<ListView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_weight="80"
android:longClickable="true"
android:clickable="false"
android:id="@+id/myListView" />

但是短点击仍然有效,给出以下日志:

01-17 10:38:18.703 25598-25598/com.example.checked I/onItemLongClick: position=0, id=0, isChecked=false 01-17 10:38:18.973 25598-25598/com.example.checked I/onItemClick: position=0, id=0, isChecked=true 01-17 10:38:22.212 25598-25598/com.example.checked I/onItemLongClick: position=0, id=0, isChecked=true 01-17 10:38:22.353 25598-25598/com.example.checked I/onItemClick: position=0, id=0, isChecked=false 01-17 10:38:28.951 25598-25598/com.example.checked I/onItemClick: position=1, id=1, isChecked=true 01-17 10:38:30.391 25598-25598/com.example.checked I/onItemClick: position=1, id=1, isChecked=false

EDIT#3-现在,如果我让onItemLongClick()返回true而不是false,长点击仍然不会选中/取消选中,但短点击会继续选中/取消选择,给出以下日志:

01-17 10:43:45.181 28980-28980/com.example.checked I/onItemLongClick: position=0, id=0, isChecked=false 01-17 10:43:49.386 28980-28980/com.example.checked I/onItemLongClick: position=0, id=0, isChecked=false 01-17 10:43:53.662 28980-28980/com.example.checked I/onItemClick: position=1, id=1, isChecked=true 01-17 10:43:55.211 28980-28980/com.example.checked I/onItemClick: position=1, id=1, isChecked=false

android:longClickable="true"添加到您的listview中。

如果您想通过onItemClick强制检查/取消检查项目,请使用以下方法:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
CheckedTextView v = (CheckedTextView) view;
boolean currentCheck = v.isChecked();
if(currentCheck == true){
((ListView) adapterView).setItemChecked(position, false);
}else{
((ListView) adapterView).setItemChecked(position, false);
}
}
});

如果您想使用onItemLongClick()来选中/取消选中项目,请尝试以下操作:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long l) {
CheckedTextView v = (CheckedTextView) view;
boolean currentCheck = v.isChecked();
if (currentCheck == true){
((ListView) adapterView).setItemChecked(position, false);
}else{
((ListView) adapterView).setItemChecked(position, true);
}

return true;
}
});

最新更新