5

Я пытаюсь установить onItemClickListener с помощью настраиваемого адаптера и настройки списка. Кажется, не может заставить слушателя работать. Я не думаю, что правильно настраиваю его. Любая помощь приветствуется. Огромное спасибо.onItemClickListener с пользовательским адаптером и списком

адаптер:

public class ModuleAdapter extends ArrayAdapter<Module> { 

Context context; 
int layoutResourceId; 
Module data[]; 

public ModuleAdapter(Context context, int layoutResourceId, 
     Module data[]) { 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    ModuleHolder holder = null; 

    if(row == null) 
    { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     holder = new ModuleHolder(); 
     holder.modJapTitle = (TextView)row.findViewById(R.id.moduleJapTitle); 
     holder.modEngTitle = (TextView)row.findViewById(R.id.moduleEngTitle); 
     holder.modComp = (TextView)row.findViewById(R.id.moduleCompletion); 
     holder.modRating = (RatingBar)row.findViewById(R.id.moduleScore); 

     row.setTag(holder); 
    } 
    else 
    { 
     holder = (ModuleHolder)row.getTag(); 
    } 

    Module module = data[position]; 
    holder.modJapTitle.setText(module.moduleJapaneseTitle); 
    holder.modEngTitle.setText(module.moduleEnglishTitle); 
    holder.modComp.setText(module.moduleCompletionRate); 
    holder.modRating.setRating(module.moduleRating); 

    return row; 
} 

static class ModuleHolder 
{ 
    TextView modEngTitle; 
    TextView modJapTitle; 
    TextView modComp; 
    RatingBar modRating; 
} 

}

Реализация:

ModuleAdapter moduleData = new ModuleAdapter(this, R.layout.module_box_item, module_data); 
    ListView listView1 = (ListView)findViewById(R.id.moduleListContainer); 
    listView1.setAdapter(moduleData); 
    listView1.setCacheColorHint(Color.TRANSPARENT); 
    listView1.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Log.v("Module Item Trigger", "Module item was triggered"); 
      Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_SHORT).show(); 
     } 
    }); 

Кроме того, здесь есть XML макет для одного из отдельных элементов в списке:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
style="@style/moduleBox" 
android:id="@+id/moduleBoxSingle" > 

<TextView 
    android:id="@+id/moduleJapTitle" 
    style="@style/moduleTitleJap" /> 
<TextView 
    android:id="@+id/moduleCompletion" 
    android:layout_above="@+id/moduleSepartor" 
    style="@style/moduleCompletion" /> 
<View 
    android:id="@+id/moduleSepartor" 
    android:layout_below="@+id/moduleJapTitle" 
    style="@style/moduleSeperator" /> 
<TextView 
    android:id="@+id/moduleEngTitle" 
    android:layout_below="@+id/moduleSepartor" 
    style="@style/moduleTitleEng" /> 
<RatingBar 
    android:id="@+id/moduleScore" 
    android:layout_below="@+id/moduleSepartor" 
    style="@style/moduleRating" 
    android:layout_alignParentRight="true" /> 

</RelativeLayout> 
+1

Все кажется хорошо выглядеть. Возможно, это проблема пользовательского интерфейса? Почему бы вам не написать logcat вместо того, чтобы вытащить Toast. Просто чтобы быть на 100% уверенным, что ваш слушатель не вызывается. –

+1

можете ли вы разместить свой макет xml здесь. – rajpara

+1

Здравствуйте, спасибо за ваш ответ. Я добавил в строку для записи в Logcat. И я также добавил в XML-макет, используемый для каждого элемента списка. – mwrazam

ответ

16

Я думаю, что это аналогичная проблема, как this.

Добавить ниже код в ваш TextView в XML

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

и повторите попытку.

+3

Это сделало трюк! Огромное спасибо. Много волос сохранено. :) – mwrazam

4

В первую очередь это вы должны impliments класса со следующим обработчиком

implements OnItemClickListener 

затем добавить функцию, как указано ниже onItemClick()

public void onItemClick(AdapterView parent, View v, int position, long id) { 
    Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_SHORT).show(); 
} 

И когда мы установили адаптер данных в listview затем добавьте следующую строку кода

itemlist.setOnItemClickListener(this); 

Надежда это будет работать для вас ...

+1

Здравствуйте, спасибо за ваш ответ.Я попробовал, но результат был таким же, как и исходный код, который у меня выше. Может быть, что-то еще не так с моим кодом, который не возбуждает этого слушателя? – mwrazam

1

Попробуйте это ...

ListView lv = (ListView)findViewById(R.id.Your_ListView_Id); // If it extends Activity. 

ИЛИ

ListView lv = getListView; // If it extends ListActivity. 
lv.setOnItemClickListener(this); // Make the Activity implement onItemClickListener 
lv.setAdapter(your_adapter); 

Отредактировано часть изменения, внесенные в контексте Toast, а Добавлена ​​SYSOUT

// Метод, который будет обрабатывать события.

public void onItemClick(AdapterView parent, View v, int position, long id{ 
    Toast.makeText(Your_Activity_Name.this, "hello", Toast.LENGTH_SHORT).show(); 
    System.out.println("This is a Test"); 
} 

ПРОВЕРКА ВЫ LOG .. ЛИ SYSOUT ЗАЯВЛЕНИЕ распечатана !!

+1

Здравствуйте, спасибо за ваше сообщение. К сожалению, это тоже не работает. Тост-сообщение все еще не срабатывает. – mwrazam

+1

Просто мин ....... попробуйте это .. Toast.make Toast.makeText (Your_Activity_Name.this, «привет», Toast.LENGTH_SHORT) .show(); –

2

У меня такая же проблема, и я исправить это действительно нравится: (см от https://github.com/sephiroth74/HorizontalVariableListView/issues/33) добавить эту строку в корневой зрения в макете

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
style="@style/moduleBox" 
android:id="@+id/moduleBoxSingle" 
android:descendantFocusability="blocksDescendants" >