问题描述
我在 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);
}
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);
}