禁用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被禁用的点击操作。

我在下面附上了一张图片以查看结果。

image

我读过有关,我应该把一个if语句在适配器类叫的IsEnabled覆盖方法,但我需要具体的解决方案。

+0

禁用点击:listview.setOnItemclickListener(NULL); –

+0

但这会禁用整个列表的onclick,不会吗? 我只想禁用选定的项目并在需要时启用它。 –

直接在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表达式和节省一些线。

+0

2人,同样的想法:) – Grisgram

+0

它的工作原理,所以左侧是不可点击我得到了观后。我将它改为右侧,因为我想让右侧无法点击,没关系我有这个想法。谢谢! 你有什么解决办法,我怎么可以禁用onClickListener或如何设置不可点击后单击所选的项目,并能够设置回听者或重新设置为可点击该TextView的。我希望能够对同一个物品多次执行此操作。 –

+0

如果可以工作,我不是很烂,但是当你调用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那个位置。

我希望它对将来的某个人有用。