禁用 ListView 项目单击然后启用它

Posted

技术标签:

【中文标题】禁用 ListView 项目单击然后启用它【英文标题】:Disable ListView item click and then Enable it 【发布时间】:2017-08-06 01:31:16 【问题描述】:

我有一个自定义适配器,因为我连续有两个 Textview。首先,我只希望左侧 TextViews 可点击并禁用右侧的点击事件。

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_
android:layout_>

<RelativeLayout
    android:layout_
    android:layout_>

    <TextView  style="@style/TextDesign"
        android:text="TextView"
        android:layout_
        android:layout_
        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_
        android:layout_
        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 时,我想禁用 List 上该 TextView 的单击。单击的电视的值将作为 SpannableString 移动到另一个 TextView,我可以在其中执行另一个操作。这意味着如果用户单击该 SpannableString 将删除该 SpannableString 并重新启用该 ListItem 被禁用的单击操作。

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

我已经读到我应该在适配器类中名为 isEnabled 的 Override 方法中添加一个 if 语句,但我需要具体的解决方案。

【问题讨论】:

禁用点击:listview.setOnItemclickListener(null); 但这会禁用整个列表的 onclick,不是吗?我只想禁用所选项目并在需要时启用它。 【参考方案1】:

直接在 TextView 上设置 ClickListener。由于 ClickListener 在触发时将单击的 View 作为参数获取,因此您可以在它发生时立即禁用监听器。

在您的getView 方法中放置

left.setOnClickListener(new View.OnClickListener() 
    @Override
    public void onClick(View v) 
         v.setOnClickListener(null); // This disables the click right away
    
);

【讨论】:

【参考方案2】:

您可以在左侧 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 人,同样的想法 :) 它可以工作,所以在我得到视图后左侧是不可点击的。我将其更改为右侧,因为我想无法点击右侧,没关系我明白了。谢谢!您是否有任何解决方案如何禁用 onClickListener 或如何在单击所选项目后设置不可点击并能够设置回侦听器或设置回该 TextView 的可点击。我希望能够多次为同一个项目执行此操作。 我不知道是否可以工作,但是当您调用 notifyDataSetChanded() 时,getView() 方法会被调用到列表的每个显示行。这可能会将 clickListener 设置回来。请确认。【参考方案3】:

我解决了如何禁用 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);


                );

如果您想将此位置设置为可点击,只需将您的布尔值设置为 true,然后 isEnabled 方法将为该位置返回 true。

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

【讨论】:

以上是关于禁用 ListView 项目单击然后启用它的主要内容,如果未能解决你的问题,请参考以下文章

单击后如何禁用 ListView 项目?

jQuery禁用链接

如何禁用在android中单击ListView?

禁用 Android ListView 项目上的点击事件

如何启用禁用的按钮

Android 在 ListView 中启用下一个项目