java - 可点击的项目形成 ListView : setOnItemClickListener won't work

标签 java android listview onitemclicklistener

我目前正在开发一个 Android 项目,我需要从 ListView 的一个项目启动一个 Activity。我搜索了大约 8 个小时,发现总是相同的解决方案,但不起作用。 这是我的代码:

在 CatalogueActivity 的 onCreate 方法中:

CtlgArrayAdapter adapter = new CtlgArrayAdapter(this, recipeName, recipeDescr, recipeDiff,
            recipePic, recipeEval);
    ListView list = (ListView)findViewById(android.R.id.list);
    list.setAdapter(adapter);
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Log.d(TAG, "Item clicked");
        }
    });    

CtlgArrayAdapter 类:

public class CtlgArrayAdapter extends ArrayAdapter<String> {
private static final String TAG = "CTLGADAPTER";

private final Activity context;
private final String[] recipeName;
private final String[] recipeDescr;
private final Integer[] recipeDiff;
private final Integer[] recipePic;
private final Integer[] recipeEval;

public CtlgArrayAdapter(Activity context, String[] recipeName, String[] recipeDescr,
                        Integer[] recipeDiff, Integer[] recipePic, Integer[] recipeEval) {
    super(context, R.layout.ctlg_list, recipeName);

    this.context = context;
    this.recipeName = recipeName;
    this.recipeDescr = recipeDescr;
    this.recipeDiff = recipeDiff;
    this.recipePic = recipePic;
    this.recipeEval = recipeEval;
}

public View getView(int position, View view, ViewGroup parent) {
    LayoutInflater inflater = context.getLayoutInflater();
    View rowView = inflater.inflate(R.layout.ctlg_list, null, true);

    TextView nameTile = (TextView) rowView.findViewById(R.id.ctlg_list_name);
    TextView diffTile = (TextView) rowView.findViewById(R.id.ctlg_list_diff);
    TextView descrTile = (TextView) rowView.findViewById(R.id.ctlg_list_descr);
    ImageView picTile = (ImageView) rowView.findViewById(R.id.ctlg_list_img);
    RatingBar rateTile = (RatingBar) rowView.findViewById(R.id.ctlg_list_rating);
    nameTile.setText(recipeName[position]);
    diffTile.setText(recipeDiff[position].toString());
    descrTile.setText(recipeDescr[position]);
    picTile.setImageResource(recipePic[position]);
    rateTile.setRating(recipeEval[position]);

    return rowView;
}

问题是,当我点击我的项目时,没有任何反应。所有互联网似乎都说这是解决方案,但它不起作用:'(

这是我的 .xml 文件: 目录布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ListView
    android:id="@android:id/list"
    android:clickable="true"
    android:layout_alignParentStart="true"
    android:layout_below="@id/linear_ctlg"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/> </RelativeLayout>    

和catalog_item布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<ImageView
    android:id="@+id/ctlg_list_img"
    android:layout_width="90dp"
    android:layout_height="90dp"
    android:focusable="false"
    android:scaleType="centerCrop"
    android:src="@drawable/no_image"
    android:layout_marginEnd="10dp"/>
<TextView
    android:id="@+id/ctlg_list_name"
    android:textColor="@color/colorPrimary"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_toEndOf="@id/ctlg_list_img"
    android:focusable="false"
    android:textStyle="bold"
    android:text="Nom de la recette sur son lit de char"/>
<TextView
    android:id="@+id/ctlg_list_diff"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toEndOf="@id/ctlg_list_img"
    android:layout_below="@id/ctlg_list_name"
    android:text="Difficile"/>
<TextView
    android:id="@+id/ctlg_list_descr"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/ctlg_list_diff"
    android:layout_toEndOf="@id/ctlg_list_img"
    android:focusable="false"
    android:textStyle="italic"
    android:text="Ceci est la description de la recette. J'en mets une longue pour être sûr qu'il y ait assez d'espace. Il fait beau aujourd'hui."/>
<RatingBar
    android:id="@+id/ctlg_list_rating"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentEnd="true"
    android:focusable="false"
    android:scaleX="0.4"
    android:scaleY="0.4"
    android:numStars="5"
    android:rating="3"
    android:stepSize="1"/> </RelativeLayout>

如果您发现我的代码有什么问题,非常感谢! :)

最佳答案

确保 catelogue_item 中的所有 View 均不可聚焦或可点击,请使用下面的代码。

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

还可以尝试使用以下命令设置根布局:android:descendantFocusability="blocksDescendants"

原因是如果列表中的任何元素包含 focusable item ,则列表的 onclick 将不会被调用。

关于java - 可点击的项目形成 ListView : setOnItemClickListener won't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43898530/

相关文章:

java - Java中的继承,如何设计没有自身属性的类

android - 通过 HTTPS 的 Xamarin Android Web 服务

java - 从 android 调用时缺少必需的请求正文,但与 postman 一起工作正常

java - ListView 无法正确显示自定义数组适配器?

.net - WPF:如何卡住 ListView 标题行,使其不会滚动到屏幕之外

c++ - 添加新项目时,在 wtl 中滚动 clistviewctrl

java - 在 ELKI 中使用 CLIQUE 进行子空间聚类

Java - 多线程代码不会在更多内核上运行得更快

安卓,推特, 'FOLLOW US'

java - FileBasedSource 无法理解与 Google Cloud Storage 中的多个特定文件相对应的 glob