Android onItemClick 方法不适用于 0 以外的 id 项

Posted

技术标签:

【中文标题】Android onItemClick 方法不适用于 0 以外的 id 项【英文标题】:Android onItemClick method not working for item of ids other than 0 【发布时间】:2021-05-23 04:09:34 【问题描述】:

我在 android 中的 onItemClick 方法有问题。 我知道其他人也遇到过这样的问题,在 SO 上找到了他们问题的一些参考资料,阅读了提供的答案和互联网上的其他一些文章,但没有帮助。就我而言,情况似乎有些不同。

我有一些对象的列表视图,我想在单击它们时显示它们的详细信息。但尴尬的是,监听器只对列表视图的第一个对象工作正常。当我单击列表视图的其他元素时,该应用程序不断中止。我不知道发生了什么事。 当我使用 id 来检索对象时,我尝试通过位置更改 id,这也不起作用。

这是我的活动(DrinkCategoryActivity)中 onCreate 方法的代码

protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drink_category);

        ArrayAdapter<Drink> listAdapter = new ArrayAdapter<>(
                this, android.R.layout.simple_list_item_1, Drink.drinks
        );

        ListView listDrinks = (ListView) findViewById(R.id.list_drinks);
        listDrinks.setAdapter(listAdapter);
        AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() 
            public void onItemClick(AdapterView<?> listDrinks,
                                    View itemView, int position, long id) 
                Intent intent = new Intent(DrinkCategoryActivity.this, DrinkActivity.class);
                intent.putExtra(DrinkActivity.EXTRA_DRINKID, (int) id);
                startActivity(intent);
            
        ;
        listDrinks.setOnItemClickListener(itemClickListener);
     

我的 DrinkActivity(在列表视图中单击时应该向我显示每个 Drink 对象的详细信息)的 onCreate 方法代码如下所示

protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drink);

        int drinkId = (int) getIntent().getExtras().get(EXTRA_DRINKID);
        Drink drinkItem = Drink.drinks[drinkId];

        ImageView image = (ImageView) findViewById(R.id.drink_image);
        image.setImageResource(drinkItem.getImageResourceId());

        TextView drink_name = (TextView) findViewById(R.id.drink_name);
        drink_name.setText(drinkItem.getName());

        TextView drink_description = (TextView) findViewById(R.id.drink_description);
        drink_description.setText(drinkItem.getDescription());

        TextView drink_price = (TextView) findViewById(R.id.drink_price);
        String price = ""+drinkItem.getPrice();
        drink_price.setText(price);
    

我不知道xml文件是否有问题,所以他们在这里:

activity_drink_category.xml 在下面

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".activities.DrinkCategoryActivity">

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical">
        <include
            layout="@layout/customer_screen_toolbar_layout"/>

        <ListView
            android:layout_marginTop="10dp"
            android:id="@+id/list_drinks"
            android:gravity="center"
            android:layout_
            android:layout_ />
    </LinearLayout>

</androidx.drawerlayout.widget.DrawerLayout>

activity_drink.xml 放在这里

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="vertical"
    tools:context=".activities.DrinkActivity">
    <include
        layout="@layout/customer_screen_toolbar_layout"/>

    <ImageView
        android:id="@+id/drink_image"
        android:layout_
        android:layout_ />

    <TextView
        android:id="@+id/drink_name"
        android:layout_
        android:layout_/>

    <TextView
        android:id="@+id/drink_description"
        android:layout_
        android:layout_/>

    <TextView
        android:id="@+id/drink_price"
        android:layout_
        android:layout_
        android:gravity="center"
        android:background="#EB8E13"
        android:textColor="@color/white" />

</LinearLayout>

任何帮助都会很有价值。提前致谢

【问题讨论】:

“当我单击列表视图的其他元素时应用程序不断中止”是什么意思? 我的意思是应用程序突然停止并显示此消息:应用程序已停止。再次打开应用 【参考方案1】:

您需要在 Intent 中传递“Position”而不是“id”。正如您在上面描述的那样,它在第一个位置上效果很好。然后你需要使用 position

intent.putExtra(DrinkActivity.EXTRA_DRINKID, (int) position);


protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drink_category);

        ArrayAdapter<Drink> listAdapter = new ArrayAdapter<>(
                this, android.R.layout.simple_list_item_1, Drink.drinks
        );

        ListView listDrinks = (ListView) findViewById(R.id.list_drinks);
        listDrinks.setAdapter(listAdapter);
        AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() 
            public void onItemClick(AdapterView<?> listDrinks,
                                    View itemView, int position, long id) 
                Intent intent = new Intent(DrinkCategoryActivity.this, DrinkActivity.class);
                intent.putExtra(DrinkActivity.EXTRA_DRINKID, (int) position);
                startActivity(intent);
            
        ;
        listDrinks.setOnItemClickListener(itemClickListener);
     

【讨论】:

感谢@VishalSojitra 的及时答复! 按您所说的尝试了位置,但问题仍然存在。应用突然停止并弹出:应用已停止,再次打开应用

以上是关于Android onItemClick 方法不适用于 0 以外的 id 项的主要内容,如果未能解决你的问题,请参考以下文章

Android ListView onItemClick Not Work

Android:带按钮的 ListView -> OnItemClick 啥都不做

java Android Activity + onItemClicker(示例)

Android ListView 在 onItemClick 之后修改

android中onItemClick中四个参数的作用

在 android 中将按钮添加到我的 ListView 后,我的 onitemclick 不起作用?