Android: почему onItemClick для моего ListView с использованием ArrayAdapter не работает?

У меня есть ListView, состоящий из LinearLayout и некоторых элементов внутри. Он управляется пользовательским адаптером, который расширяет ArrayAdapter>. По какой-то причине он не вызывается, когда я нажимаю на отображаемые элементы. В logcat ничего не происходит. Ни ошибки, ни лога, ничего.

Я прочитал ряд подобных вопросов и попытался реализовать решения, но, похоже, это не моя проблема. Я попытался onItemClickListener не срабатывать на пользовательском ArrayAdapter и Прослушиватель списка onitemclick не работает и OnItemClick не отвечает на клики

Вот мой код активности:

    ratingAdapter = new RatingAdapter(this, RatingRecord);
    ratingListView = (ListView) findViewById(R.id.ratingsListView);
    ratingListView.setAdapter(ratingAdapter);
    ratingListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Log.d("Ratings update", "Clicked button for " + RatingRecord.get(i).get(1));
            RateRestaurant(RatingRecord.get(i));
        }
    });

Вот мой товар xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="horizontal"
    android:clickable="true"
    android:id="@+id/ratings_row"
    style="@android:style/Widget.Button"
    android:descendantFocusability="blocksDescendants"
    android:focusable="true">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:layout_weight="2"
            android:id="@+id/rating_name"
            android:focusable="false"/>
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:adjustViewBounds="true"
            android:paddingRight="5dp"
            android:id="@+id/rating_icon"
            android:focusable="false"/>
        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:layout_weight="1"
            android:id="@+id/rating_date"
            android:gravity="center_horizontal"
            android:focusable="false"/>

</LinearLayout>

Вот макет ListView из основного действия:

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:id="@+id/ratingsListView"/>

Вот суть адаптера RatingAdapter:

public RatingAdapter(Context context, ArrayList<ArrayList<String>> inValues) {
    super(context, R.layout.ratings_row, inValues);
    this.context = context;
    ratingList = CsvUtil.fromCsvTable(context.getString(R.string.Ratings_OptionsList));
}
    private ViewHolder(View c, Integer n, Integer i, Integer d) {
        NameView = (TextView)c.findViewById(n);
        IconView = (ImageView)c.findViewById(i);
        DateView = (TextView)c.findViewById(d);
    }
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // Get the data item for this position
    ArrayList<String> record = getItem(position);
    // Check if an existing view is being reused, otherwise inflate the view
    ViewHolder vh;
    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.ratings_row, parent, false);
        vh = new ViewHolder(convertView,R.id.rating_name,R.id.rating_icon,R.id.rating_date);
        convertView.setTag(vh);
    } else {
        vh = (ViewHolder)convertView.getTag();
    }

    // Lots of data calculation and populating ViewHolder elements

    return convertView;
}

Ничего не произошло. Как я уже сказал, нет журнала, события или ошибки. Что я сделал не так?


person Scott    schedule 08.08.2014    source источник
comment
Можете ли вы опубликовать макет ratingsListView в основной деятельности?   -  person mmlooloo    schedule 08.08.2014
comment
Ваш список заполнен данными или нет?   -  person Aniruddha    schedule 08.08.2014
comment
Опубликован рейтинг ListView. Да, в моем списке есть один или несколько элементов, и они не реагируют на нажатие.   -  person Scott    schedule 08.08.2014
comment
не могли бы вы попробовать удалить эту строку style=@android:style/Widget.Button из макета элемента списка и дайте мне знать?   -  person Haresh Chhelana    schedule 08.08.2014
comment
Можете ли вы опубликовать основной макет полностью?   -  person mmlooloo    schedule 08.08.2014
comment
@Haresh Holy Smokes - это больше не похоже на кнопку, но щелкает! Как вы узнали об этом, и есть ли способ сохранить стиль кнопки?   -  person Scott    schedule 08.08.2014
comment
Попробуйте создать изображение со стилем кнопки и установить его в качестве фона для элемента списка.   -  person Haresh Chhelana    schedule 08.08.2014
comment
Можете ли вы поставить это как ответ? Я заменил его на: android:background=@android:drawable/btn_default   -  person Scott    schedule 08.08.2014


Ответы (2)


установить при нажатии на ваш convertview в методе getView() адаптера.

convertView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        Log.d("Ratings update", "Clicked button for " + RatingRecord.get(i).get(1));
        RateRestaurant(RatingRecord.get(i));       
    }
}
person Muhammad Aamir Ali    schedule 08.08.2014
comment
Адаптер не имеет доступа к методу или полю, вызываемому в прослушивателе из основного действия. Как бы я это сделал? - person Scott; 08.08.2014

Ответ предоставлен Haresh в комментариях.

"Пожалуйста, попробуйте удалить эту строку style="@android:style/Widget.Button" из макета элемента списка"

Я использовал стиль Widget.Button, чтобы придать мне вид кнопки, хотя ListView уже предоставил функциональность щелчка. Однако стиль не просто изменил внешний вид. Он также переопределял функцию щелчка. Чтобы получить желаемый эффект без побочных эффектов, я просто установил фон, используя:

android:background="@android:drawable/btn_default"
person Scott    schedule 19.08.2014