禁用ListView项目单击然后启用它
我有一个自定义适配器,因为我有两个Textviews在一行。首先,我只想要左侧的TextViews可点击并禁用右侧的点击事件。禁用ListView项目单击然后启用它
layout_list_xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView style="@style/TextDesign"
android:text="TextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/left" />
<TextView style="@style/TextDesign"
android:text="TextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:id="@+id/right" />
</RelativeLayout>
</LinearLayout>
自定义适配器:
public class CustomAdapter extends BaseAdapter {
Context context;
List<Occurence> occurenceList;
TextView left, right;
public CustomAdapter(Context context, List<Occurence> occurenceList) {
this.context = context;
this.occurenceList = occurenceList;
}
@Override
public int getCount() {
return occurenceList.size();
}
@Override
public Object getItem(int position) {
return occurenceList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater=LayoutInflater.from(context);
View v=inflater.inflate(R.layout.layout_list,parent,false);
left=(TextView) v.findViewById(R.id.left);
right=(TextView) v.findViewById(R.id.right);
left.setText(occurenceList.get(position).singleNumber);
right.setText(occurenceList.get(position).occurence+" occurence");
v.setTag(occurencekList.get(position).getId());
return v;
}
@Override
public boolean areAllItemsEnabled() {
return super.areAllItemsEnabled();
}
@Override
public boolean isEnabled(int position) {
return super.isEnabled(position);
}
}
所以当TextView的用户点击我要禁用点击在列表中的TextView。被点击的TV的值将作为SpannableString移动到另一个TextView,我可以在哪里执行另一个操作。这意味着如果用户单击该SpannableString将删除该SpannableString并重新启用该ListItem被禁用的点击操作。
我在下面附上了一张图片以查看结果。
我读过有关,我应该把一个if语句在适配器类叫的IsEnabled覆盖方法,但我需要具体的解决方案。
直接在TextView上设置ClickListener。由于ClickListener在触发时获取单击的View as参数,所以您可以在发生时禁用侦听器。
在你getView
方法把
left.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setOnClickListener(null); // This disables the click right away
}
});
您可以点击监听器设置你的左边TextView的,你必须做的事,然后删除监听,直到需要。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater=LayoutInflater.from(context);
View v=inflater.inflate(R.layout.layout_list,parent,false);
left=(TextView) v.findViewById(R.id.left);
left.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//In here your data treatment
left.setOnClickListener(null);
}
});
right=(TextView) v.findViewById(R.id.right);
left.setText(occurenceList.get(position).singleNumber);
right.setText(occurenceList.get(position).occurence+" occurence");
v.setTag(occurencekList.get(position).getId());
return v;
}
请记住,如果你使用Java 8,你可以监听更改为lambda表达式和节省一些线。
2人,同样的想法:) – Grisgram
它的工作原理,所以左侧是不可点击我得到了观后。我将它改为右侧,因为我想让右侧无法点击,没关系我有这个想法。谢谢! 你有什么解决办法,我怎么可以禁用onClickListener或如何设置不可点击后单击所选的项目,并能够设置回听者或重新设置为可点击该TextView的。我希望能够对同一个物品多次执行此操作。 –
如果可以工作,我不是很烂,但是当你调用notifyDataSetChanded()时,getView()方法会被调用到列表的每一行。这可能会将clickListener设置回来。请确认。 –
我解决了如何禁用listItem点击并在需要时启用它。 将布尔变量添加到自定义列表中的每个项目,并在适配器类中创建布尔实例。
public class CustomAdapter extends BaseAdapter {
Context context;
List<Object> objectList;
public boolean clicked=false;
public CustomAdapter(Context context, List<Object> objectList) {
this.context = context;
this.objectList = objectList;
}
@Override
public int getCount() {
return objectList.size();
}
@Override
public Object getItem(int position) {
return objectList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//your custom code....
return View;
}
@Override
public boolean areAllItemsEnabled() {
return super.areAllItemsEnabled();
}
//this is what you need
@Override
public boolean isEnabled(int position) {
if(objectList.get(position).yourBoolean()==false){
return false;
}
if(objectList.get(position).yourBoolean()==true && clicked==true){
return true;
}
return super.isEnabled(position);
}
在你main_activity.java调用你的list.onItemClickListener
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
//Then the isEnabled method will return false for this position and
//this item wont be clickable
objectList.get(position).setYourBooleanValue(false);
customAdapter.setclicked(true);
}
});
如果你想重新设置这个位置上点击,只要将布尔回真,那么的IsEnabled方法将返回true那个位置。
我希望它对将来的某个人有用。
禁用点击:listview.setOnItemclickListener(NULL); –
但这会禁用整个列表的onclick,不会吗? 我只想禁用选定的项目并在需要时启用它。 –