ListView с интерактивным / редактируемым виджетом - PullRequest
44 голосов
/ 20 января 2010

Можно ли использовать OnItemClickListener в ListView, когда в макете «Элементы» есть интерактивный / редактируемый виджет (RadioButton, EditText или CheckBox)?

Ответы [ 6 ]

68 голосов
/ 20 января 2010

Возможно, вы захотите взглянуть на эту проблему . Наличие фокусируемого элемента в строке ListView вызывает OnItemClickListener NOT для вызова. Однако это не означает, что у вас не может быть фокусируемых / кликабельных элементов подряд, есть некоторые обходные пути, например этот .

Кроме того, вы можете взглянуть на экран Журналы вызовов. Он имеет ListView с интерактивным элементом (значок вызова справа). См. Исходный код здесь

20 голосов
/ 03 сентября 2012

Цитирую комментарий # 31 в ссылке, упомянутой Самухом (которая решила проблему для меня):

Фактически вы можете добавить его в XML макета (если он накачан на единицу): android: downndantFocusability = "blockDescendants".

Добавление сюда JIC, что веб-страница в будущем не работает.

11 голосов
/ 22 февраля 2013

Если какой-либо элемент строки списка содержит фокусируемое или кликабельное представление, OnItemClickListener не будет работать.

элемент строки должен иметь параметр типа android:descendantFocusability="blocksDescendants"

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:baselineAligned="false"
    android:descendantFocusability="blocksDescendants"
    android:gravity="center_vertical" >

    // your other widgets here

</LinearLayout>
3 голосов
/ 11 октября 2013

Перепробовал много сложных решений, но это было самое простое, которое сработало:

Просто используйте android:focusable="false" как в:

<CheckBox
    android:id="@+id/fav_check_box"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false" />
0 голосов
/ 21 июля 2016

Я исправил свою проблему по-другому, в моем предмете у меня есть несколько LinearLayout так что если вы дадите идентификатор своему linearayout и setOnclickListener в классе адаптера, он будет работать, исчезнет только оригинальный эффект прикосновения. но эта ссылка Настройка LinearLayout в качестве кнопки полезна для того, чтобы сделать linearlaout похожей на кнопку при нажатии

пункт

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="10dp">

    <TextView
        android:id="@+id/txt_item_followers_name"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:gravity="center|start"
        android:paddingLeft="15dp"
        android:text="Ali"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="35dp"
        android:layout_height="35dp"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/txt_item_followers_name"
        android:layout_marginLeft="10dp"
        android:src="@drawable/puan_icon" />

    <TextView
        android:id="@+id/txt_item_followers_mark"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView"
        android:layout_toEndOf="@+id/imageView"
        android:background="@color/red_400"
        android:paddingLeft="10dp"
        android:text="25.5"
        android:textAppearance="?android:attr/textAppearanceSmall" />

    <LinearLayout
        android:id="@+id/linear_one"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_alignParentTop="true"
        android:layout_toEndOf="@+id/txt_item_followers_name"
        android:background="@color/red_400"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/btn_item_followers_2b_follow"
            android:layout_width="100dp"
            android:layout_height="match_parent"
            android:layout_alignParentEnd="true"
            android:layout_marginLeft="10dp"
            android:src="@drawable/follow_buton" />
    </LinearLayout>


</RelativeLayout>

внутри метода getView

 @Override
    public View getView(final int position, View convertView,
                        ViewGroup parent) {
        View view = convertView;
        if (convertView == null)
            view = inflater.inflate(R.layout.deneme, null);

        final Followers2 myObj = myList.get(position);
        LinearLayout linear_one = (LinearLayout) view.findViewById(R.id.linear_one); // HERE WE DOMUNİCATE IT
        linear_one.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(parentActivity, "One Two", Toast.LENGTH_SHORT).show();
            }
        });

        TextView name = (TextView) view.findViewById(R.id.txt_item_followers_name);
        TextView mark = (TextView) view.findViewById(R.id.txt_item_followers_mark);
        final ImageView btn_follow = (ImageView) view.findViewById(R.id.btn_item_followers_2b_follow);
        name.setText(myObj.getName());
        mark.setText(myObj.getScore());
       /* if (myObj.isFollow() == true) {
            btn_follow.setImageResource(R.drawable.following_buton);
        } else {
            btn_follow.setImageResource(R.drawable.follow_buton);
        }

        btn_follow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Followers2 myObj = myList.get(position);
                if (myObj.isFollow() == true) {
                    btn_follow.setImageResource(R.drawable.following_buton);
                } else {
                    btn_follow.setImageResource(R.drawable.follow_buton);
                }
            }
        });*/

        return view;
    }
0 голосов
/ 12 января 2015

Два лучших решения

  1. Добавить android:descendantFocusability="beforeDescendants" к списку просмотра в xml ИЛИ
  2. Установить данные два атрибута на false

как

   android:focusable="false"
   android:focusableInTouchMode="false"

Затем он будет обрабатывать дочерние события элемента списка (Button, EditText и т. Д.) Вместо listView.setOnItemClick.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...