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

时间:2017-03-15 10:49:38

标签: android listview onitemclick

我有一个自定义适配器,因为我连续有两个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_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时,我想要禁用List上TextView的单击。点击的电视的值将作为SpannableString移动到另一个TextView,我可以在其中执行另一个操作。这意味着如果用户单击将删除该SpannableString的SpannableString并重新启用已禁用的ListItem的单击操作。

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

image

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

3 个答案:

答案 0 :(得分: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
    }
});

答案 1 :(得分:0)

您可以在左侧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 :(得分:0)

我解决了如何禁用listItem单击并在需要时启用它。 将boolean变量添加到自定义列表中的每个项目,并在适配器类中创建一个布尔实例。

MYSQL_BIND

在main_activity.java中,调用list.onItemClickListener

nullptr

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

我希望将来对某人有用。