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?