ListView Custom OnItemClickListener не вызывается

Хорошо, я рвал свои волосы последние пару часов, пытаясь выяснить, почему мой настраиваемый адаптер списка не может работать должным образом с OnItemClickListener. У меня есть TextView, где я использую атрибут DrawableLeft, чтобы нарисовать изображение слева от текстового представления внутри ListView. Теперь в моем текстовом представлении я устанавливаю для android:focusable and android:focusableInTouchMode, а также для android:clickable all значение false, а в корне моего списка я устанавливаю android:downndantFocusability для blocksDescendants, так как это типичные проблемы, возникающие с этой конкретной проблемой., Теперь вот файлы макетов, с которыми я собираюсь:

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/menu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#363636"
android:dividerHeight="1dp"
android:divider="@drawable/menudivider"
android:paddingLeft="@dimen/list_padding"
android:paddingRight="@dimen/list_padding"
android:descendantFocusability="blocksDescendants" />

Это мой TextView Layout:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/menu_list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="#fff"
    android:typeface="sans"
    android:textSize="20sp"
    android:drawablePadding="10dp"
    android:padding="7dp"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:clickable="false" />

Я установил DrawableLeft Image программно внутри моей функции getView в моем классе, производном от BaseAdapter. Что касается действия, в котором я реализую функцию OnItemClickListener, то оно выглядит примерно так:

public class ActivityBase extends Activity implements OnItemClickListener {

private ListView mSlidinglist = null;

@Override
public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);

              mSlidinglist = (ListView)findViewById(R.id.menu);
              ArrayList<MenuItem> items = new ArrayList<MenuItem>();
              items.add(new MenuItem("Test",R.drawable.test) );
              CustomAdapter adapter = new CustomAdapter(this,items);

              mSlidinglist.setAdapter(adapter);
              mSlidinglist.setOnItemClickListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Toast.makeText(this, "Clicked", Toast.LENGTH_LONG).show();

     }
  }

Вот мой пользовательский адаптер:

    public class CustomAdapter extends BaseAdapter
     {
       private ArrayList<MenuItem> items;
       private Context mContext;

      public CustomAdapter(Context context, ArrayList<MenuItem> items)
        {
        this.items = items;
        this.mContext = context;
        }

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View v = convertView;
    if(v == null) {
        LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        v = vi.inflate(R.layout.list_row, null);
    }

    final MenuItem l = items.get(position);

    if(l != null) {
        TextView title = (TextView) v.findViewById(R.id.menu_list);

        title.setText(l.getTitle());
        title.setCompoundDrawablesWithIntrinsicBounds(l.getImageId(), 0, 0, 0);
    }
    return v;
}

@Override
public int getCount() {
    return items.size();
}

@Override
public Object getItem(int position) {
    return items.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

}

Класс MenuItem - это просто сеттеры и геттеры для нужных мне полей...

Я не могу заставить это выстрелить, я не понимаю, почему любая помощь ценится, если требуется больше кода, просто дайте мне знать, просто не хочу публиковать все. Подкласс BaseAdapter очень прост: он просто устанавливает текст TextView и поля DrawableLeft с помощью setCompoundDrawablesWithIntrinsicBounds. Если кто-то может помочь, это будет с благодарностью.

4 ответа

Решение

Хорошо, я только что проверил код, немного его отредактировал и теперь он работает.

Что я изменил:

   if(l != null) {
    TextView title = (TextView) v; // insted of findView

    title.setText(l.getTitle());
    title.setCompoundDrawablesWithIntrinsicBounds(l.getImageId(), 0, 0, 0);
}

Примените их к дочерним представлениям

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

Примените это к Родительскому макету

android:descendantFocusability="blocksDescendants"

в вашем коде добавьте эти две строки:

 mSlidinglist.setClickable(true)
 mSlidinglist.setEnable(true)

Странно, я заставил мою работать, когда я удалил атрибуты, касающиеся фокусируемости и кликабельности. Я не понимаю этого, но посмотрим, сработает ли это для вас.

Попробуйте изменить действие, чтобы расширить ListActivity.. что является ошибкой в ​​logcat?

Другие вопросы по тегам