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>

person mwrazam    schedule 29.06.2012    source источник
comment
Все выглядит хорошо. Возможно, это проблема пользовательского интерфейса? Почему бы вам не написать в logcat вместо всплывающего Toast. Просто чтобы быть на 100% уверенным, что вашему слушателю не звонят.   -  person Frank Sposaro    schedule 29.06.2012
comment
Вы можете опубликовать свой макет xml здесь.   -  person rajpara    schedule 29.06.2012
comment
Здравствуйте, спасибо за ваш ответ. Я добавил строку для записи в Logcat. И я также добавил макет XML, используемый для каждого отдельного элемента списка.   -  person mwrazam    schedule 30.06.2012


Ответы (4)


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

Добавьте приведенный ниже код в свой TextView в XML.

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

и попробуй еще раз.

person dreamtale    schedule 30.06.2012
comment
Это помогло! Большое спасибо. Сохранено много волос. :) - person mwrazam; 30.06.2012

Прежде всего, для этого вам нужно внедрить класс со следующим обработчиком

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);

Надеюсь, это сработает для вас...

person coading fever    schedule 29.06.2012
comment
Здравствуйте, спасибо за ваш ответ. Я попробовал это, но результат был таким же, как и исходный код, который у меня есть выше. Может быть, что-то еще не так с моим кодом, который не запускает этот слушатель? - person mwrazam; 30.06.2012

У меня такая же проблема, и я исправляю ее, например: (см. 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" >
person TuanTran    schedule 20.09.2016

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

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

OR

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");
}

ПРОВЕРЬТЕ ЖУРНАЛ.. ПЕЧАТАЕТСЯ ЛИ ВЫПИСКА SYSOUT!!

person Kumar Vivek Mitra    schedule 30.06.2012
comment
Здравствуйте, спасибо за ваше сообщение. К сожалению, это тоже не работает. Тост-сообщение по-прежнему не срабатывает. - person mwrazam; 30.06.2012
comment
Минуточку.......попробуйте это.. Toast.make Toast.makeText(Your_Activity_Name.this, привет, Toast.LENGTH_SHORT).show(); - person Kumar Vivek Mitra; 30.06.2012