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

问题描述

我在 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_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activities.DrinkCategoryActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        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_width="match_parent"
            android:layout_height="wrap_content" />
    </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_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".activities.DrinkActivity">
    <include
        layout="@layout/customer_screen_toolbar_layout"/>

    <ImageView
        android:id="@+id/drink_image"
        android:layout_width="190dp"
        android:layout_height="190dp" />

    <TextView
        android:id="@+id/drink_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/drink_description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

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

</LinearLayout>

任何帮助都是有价值的。提前致谢

解决方法

您需要在 Intent 中传递“Position”而不是“id”。正如您在上面描述的,它在第一个位置上工作正常。然后你需要使用位置

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);
    }