2016-06-06 5 views
0

У меня есть ListView с пользовательским адаптером и элементами списка, содержащими только TextView. Элементы списка имеют метод OnItemClick, установленный в методе обратного вызова onCreate.ListView onItemClick не называется

templatesListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Log.d(DEBUG_TAG, "templatesListView onClick()"); 
      //item is selected from the cursor to get necessary data 
      Log.d(DEBUG_TAG, "ListView count: " + templatesListView.getCount()); 

      Log.d(DEBUG_TAG, "messagesCursor count: " + messagesCursor.getCount()); 

      if (position >= messagesCursor.getCount()) { 
       Log.d(DEBUG_TAG, "Unable to access element " + position + ", it does not exist in the messagesCursor. Cursor count: " + messagesCursor.getCount()); 
      } 

      messagesCursor.moveToPosition(position); 
      final String selectedItemName = messagesCursor.getString(1); 

      AlertDialog.Builder builder = new AlertDialog.Builder(SendMessageActivity.this); 
      builder.setTitle(selectedItemName).setMessage("Do you want to use template: "+selectedItemName+"?"); 

      //Use template onClick 
      builder.setPositiveButton("Use", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dlg, int x) { 
        messageEditText.setText(selectedItemName); 
       } 
      }); 

      //Cancel onClick 
      builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dlg, int x) { 
       } 
      }); 
      builder.show(); 
     } 
    }); 

элемент управления ListView в файле макета деятельности определяется как:

<ListView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/templatesListView" 
    android:layout_alignParentRight="true" 
    android:clickable="true" 
    android:layout_alignParentEnd="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_below="@+id/sendButton" /> 

Элемент списка определяется в отдельном файле макета, как:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:weightSum="1"> 


<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="Medium Text" 
    android:id="@+id/name_textView" /> 

OnClick метод вызывается правильно, когда я запускаю приложение на Android 4.4.4, но когда я запускаю его на Android 5.1.1 он вообще не называется.

Компоновка элемент списка был также создан для v21 + отдельно, пожалуйста, найти код ниже:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:weightSum="1"> 


<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:text="Medium Text" 
    android:id="@+id/name_textView" 
    android:singleLine="true" 
    android:textColor="@color/foreground_material_light" 
    android:theme="@android:style/Widget.Material.Light.Button.Borderless" /> 

ли вы, ребята, знаете, что я должен изменить, чтобы заставить его работать на уровне API 21+ ? Это только файл xml (атрибуты?) Или мне нужно изменить реализацию? Ура!

+0

Возможно, у вашего списка нет товаров в нем atm? Я просто догадываюсь, потому что не было ничего, что подтвердило бы, что ваш список был заполнен. Отвечая, пожалуйста, используйте @, а затем мое имя, чтобы я мог быть уведомлен. –

+0

@AkashAggarwal: listView успешно заполнен пользовательским адаптером. Может быть, адаптер вызывает проблему с новыми версиями API? –

+0

Я работаю над API 23 с последних 4-5 месяцев, и ваш код выглядит очень хорошо для меня.Не могли бы вы поделиться кодом внутри 'onItemClick()'? –

ответ

0

Глядя на this closely related problem and the selected answer, я думаю, вы должны внести некоторые изменения в свой код.

Видя, что у вас есть LinearLayout, который имеет ListView как вид ребенка - и это ListView имеет LinearLayout, как ребенок, который, в свою очередь, имеет TextView как ребенок? В этом случае, возможно, у дочерних представлений вашего ListView должен быть onClickListener. Это означает, что установить следующие атрибуты в name_textView:

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:text="Medium Text" 
    android:focusableInTouchMode="false" 
    android:clickable="false" 
    android:focusable="false" 
    android:id="@+id/name_textView" /> 

Тогда держите templatesListView как:

<ListView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/templatesListView" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_below="@+id/sendButton" /> 

И, наконец, изменить свой список-пункт линейный макет следующим образом:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:clickable="true" 
android:weightSum="1"> 

Попробуйте и дайте мне знать, если это поможет.

+0

Привет, спасибо за такой быстрый ответ. К несчастью, атрибут фокусировки потомка не решил его. Мне интересно, какой элемент на самом деле должен быть кликабельным в этом случае - это элемент списка или listView? Может быть, андроид: clickable объявлен истинным в неправильном месте? –

+0

Итак, у вас есть «LinearLayout», у которого есть «ListView» в качестве дочернего представления, и этот «ListView» имеет «LinearLayout» в качестве дочернего элемента, который, в свою очередь, имеет «TextView» в качестве дочернего? В этом случае, возможно, у дочерних представлений вашего ListView должен быть onClickListener. – ishmaelMakitla

+0

Вы предлагаете мне реализовать макет элемента списка как TextView без LinearLayout? –

0

Просто удалите это,

android:clickable="true" 

от вашего ListView. Это фактически блокирует клики от передачи в отдельные строки.

+0

@ aritraroy93 все еще не работает. Но я предполагаю, что это должна быть проблема .xml, поэтому я буду продолжать копать –

1

SOLVED: Я думаю, что дополнительный файл макета вводит в заблуждение для приложения. Он был назван точно так же, как и оригинал, но с добавлением (v21) в конце его. После удаления второго файла он отлично работает.

+0

. Каковы были точные имена двух файлов макета? И каков был аргумент, который вы передали в своем CursorAdapter, который рассказал адаптеру имя файла макета дочернего элемента? –

+0

@AkashAggarwal list_item_pattern.xml и list_item_pattern (v21) .xml. Макет был завышен с именем R.layout.list_item_pattern. Теперь это выглядит очевидно :) –

+0

Я не думаю, что вы должны использовать скобки в именах файлов. Новый макет будет работать, если вы удалите скобки и обновите R.layout .. соответственно. –

Смежные вопросы