Android - 使用上下文菜单删除 ListView 中的对象
Android - Delete object in ListView with ContextMenu
首先,如果我有任何语言错误,我深表歉意,因为我不是英语。
编辑:已解决。
我正在尝试编写一个简单的天气应用程序。有一个城市列表,当您按下其中一个城市时,您会获得有关温度等的更多信息。
我得到了一个包含所有信息的城市 class。
ListView 运行良好,当我选择一个城市时,信息是正确的。
下一步,我想使用上下文菜单从列表中删除一个城市。
我可以在长按时显示 ContextMenu,但我无法删除项目,因为当我按下删除按钮时,我的代码不正确:java.lang.IndexOutOfBoundsException: Index: 4, Size: 0
因此应用程序强制关闭.
这是我的代码:
package com.example.sauce.meteojojo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ListView listView;
//Liste des villes
private final List<City> ville = new ArrayList<City>();
Calendar Maintenant = Calendar.getInstance();
ArrayAdapter adapter;
private int position;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Création de la listwiew liée à son ID
listView = (ListView) findViewById(R.id.listView1);
//Liste des villes
final List<City> ville = new ArrayList<City>();
//Creation des villes manuellement avec les informations decrites dans l'objet city
City Paris = new City("Paris", "France", Maintenant, 12, "Sud", 1024, 30);
City NewYork = new City("New York", "USA", Maintenant, 11, "Nord", 1023, 20);
City Tokyo = new City("Tokyo", "Japon", Maintenant, 13, "Est", 1022, 15);
City Rome = new City("Rome", "Italie", Maintenant, 10, "Ouest", 1021, 28);
City LosAngeles = new City("Los Angeles", "USA", Maintenant, 14, "Sud", 1020, 19);
City Moscou = new City("Moscou", "Russie", Maintenant, 15, "Nord", 1019, 12);
//Ajout des nom et pays sur l'arraylist, tostring change en string pour la liste.
ville.add(Paris);
ville.add(NewYork);
ville.add(Tokyo);
ville.add(Rome);
ville.add(LosAngeles);
ville.add(Moscou);
//Creation de l'arrayadapter permettant d'adapter l'arraylist pour la listview
ArrayAdapter adapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, ville);
listView.setAdapter(adapter);
registerForContextMenu(listView);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//gestion du clic simple
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent monIntent = new Intent(MainActivity.this,InfosVille.class);
//envoi des différents arguments de la classe city
monIntent.putExtra("no",ville.get(position).getNom());
monIntent.putExtra("pa",ville.get(position).getPays());
monIntent.putExtra("da",ville.get(position).getDate());
monIntent.putExtra("vi",ville.get(position).getVitesse());
monIntent.putExtra("ve",ville.get(position).getVent());
monIntent.putExtra("pr",ville.get(position).getPression());
monIntent.putExtra("te",ville.get(position).getTemp());
startActivity(monIntent);
//Test toast
//Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
//Toast.LENGTH_SHORT).show();
}
});
}
@Override
//Récupération du petit menu Supprimer
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, view, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
}
@Override
//Apres appui sur supprimer
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.del:
position = (int) info.id;
ville.remove(position);
this.adapter.notifyDataSetChanged();
return true;
default:
return super.onContextItemSelected(item);
}
}
}
City.java(对象)
package com.example.sauce.meteojojo;
import java.util.Calendar;
/**
* Created by sauce on 14/09/16.
*/
public class City {
private String nom;
private String pays;
private Calendar date;
private int vitesse;
private String vent;
private int pression;
private int temp;
public City(String nom, String pays, Calendar date, int vitesse, String vent, int pression, int temp) {
this.nom = nom;
this.pays = pays;
this.date = date;
this.vitesse = vitesse;
this.vent = vent;
this.pression = pression;
this.temp = temp;
}
@Override
public String toString(){
return this.nom+" ("+this.pays+")";
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public int getTemp() {
return temp;
}
public void setTemp(int temp) {
this.temp = temp;
}
public int getPression() {
return pression;
}
public void setPression(int pression) {
this.pression = pression;
}
public String getVent() {
return vent;
}
public void setVent(String vent) {
this.vent = vent;
}
public int getVitesse() {
return vitesse;
}
public void setVitesse(int vitesse) {
this.vitesse = vitesse;
}
public String getDate() {
String date2 = date.getTime().toString();
return date2;
}
public void setDate(Calendar date) {
this.date = date;
}
public String getPays() {
return pays;
}
public void setPays(String pays) {
this.pays = pays;
}
}
我认为问题是我没有找到要删除的正确内容..
感谢您阅读我的 post !
祝你有美好的一天。
编辑:多亏了答案,这个问题已经解决,但另一个问题出现在函数 onContextItemSelected 的这一行:
this.adapter.notifyDataSetChanged();
我也解决了这个错误,因为适配器也在onCreate函数中定义,所以没有使用全局适配器。
谢谢,祝你有美好的一天!
问题是您定义了 final List<City> ville
两次(一次在主 activity 中,一次在 onCreate 函数中)。您在 onCreate 中将城市添加到本地城市,这就是为什么当您尝试从中删除内容时全局城市为空的原因。
只需删除 onCreate 中的 final List<City> ville = new ArrayList<City>();
行,您的代码就可以正常工作。
首先,如果我有任何语言错误,我深表歉意,因为我不是英语。
编辑:已解决。
我正在尝试编写一个简单的天气应用程序。有一个城市列表,当您按下其中一个城市时,您会获得有关温度等的更多信息。 我得到了一个包含所有信息的城市 class。 ListView 运行良好,当我选择一个城市时,信息是正确的。
下一步,我想使用上下文菜单从列表中删除一个城市。
我可以在长按时显示 ContextMenu,但我无法删除项目,因为当我按下删除按钮时,我的代码不正确:java.lang.IndexOutOfBoundsException: Index: 4, Size: 0
因此应用程序强制关闭.
这是我的代码:
package com.example.sauce.meteojojo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ListView listView;
//Liste des villes
private final List<City> ville = new ArrayList<City>();
Calendar Maintenant = Calendar.getInstance();
ArrayAdapter adapter;
private int position;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Création de la listwiew liée à son ID
listView = (ListView) findViewById(R.id.listView1);
//Liste des villes
final List<City> ville = new ArrayList<City>();
//Creation des villes manuellement avec les informations decrites dans l'objet city
City Paris = new City("Paris", "France", Maintenant, 12, "Sud", 1024, 30);
City NewYork = new City("New York", "USA", Maintenant, 11, "Nord", 1023, 20);
City Tokyo = new City("Tokyo", "Japon", Maintenant, 13, "Est", 1022, 15);
City Rome = new City("Rome", "Italie", Maintenant, 10, "Ouest", 1021, 28);
City LosAngeles = new City("Los Angeles", "USA", Maintenant, 14, "Sud", 1020, 19);
City Moscou = new City("Moscou", "Russie", Maintenant, 15, "Nord", 1019, 12);
//Ajout des nom et pays sur l'arraylist, tostring change en string pour la liste.
ville.add(Paris);
ville.add(NewYork);
ville.add(Tokyo);
ville.add(Rome);
ville.add(LosAngeles);
ville.add(Moscou);
//Creation de l'arrayadapter permettant d'adapter l'arraylist pour la listview
ArrayAdapter adapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, ville);
listView.setAdapter(adapter);
registerForContextMenu(listView);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//gestion du clic simple
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent monIntent = new Intent(MainActivity.this,InfosVille.class);
//envoi des différents arguments de la classe city
monIntent.putExtra("no",ville.get(position).getNom());
monIntent.putExtra("pa",ville.get(position).getPays());
monIntent.putExtra("da",ville.get(position).getDate());
monIntent.putExtra("vi",ville.get(position).getVitesse());
monIntent.putExtra("ve",ville.get(position).getVent());
monIntent.putExtra("pr",ville.get(position).getPression());
monIntent.putExtra("te",ville.get(position).getTemp());
startActivity(monIntent);
//Test toast
//Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
//Toast.LENGTH_SHORT).show();
}
});
}
@Override
//Récupération du petit menu Supprimer
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, view, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
}
@Override
//Apres appui sur supprimer
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.del:
position = (int) info.id;
ville.remove(position);
this.adapter.notifyDataSetChanged();
return true;
default:
return super.onContextItemSelected(item);
}
}
}
City.java(对象)
package com.example.sauce.meteojojo;
import java.util.Calendar;
/**
* Created by sauce on 14/09/16.
*/
public class City {
private String nom;
private String pays;
private Calendar date;
private int vitesse;
private String vent;
private int pression;
private int temp;
public City(String nom, String pays, Calendar date, int vitesse, String vent, int pression, int temp) {
this.nom = nom;
this.pays = pays;
this.date = date;
this.vitesse = vitesse;
this.vent = vent;
this.pression = pression;
this.temp = temp;
}
@Override
public String toString(){
return this.nom+" ("+this.pays+")";
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public int getTemp() {
return temp;
}
public void setTemp(int temp) {
this.temp = temp;
}
public int getPression() {
return pression;
}
public void setPression(int pression) {
this.pression = pression;
}
public String getVent() {
return vent;
}
public void setVent(String vent) {
this.vent = vent;
}
public int getVitesse() {
return vitesse;
}
public void setVitesse(int vitesse) {
this.vitesse = vitesse;
}
public String getDate() {
String date2 = date.getTime().toString();
return date2;
}
public void setDate(Calendar date) {
this.date = date;
}
public String getPays() {
return pays;
}
public void setPays(String pays) {
this.pays = pays;
}
}
我认为问题是我没有找到要删除的正确内容.. 感谢您阅读我的 post !
祝你有美好的一天。
编辑:多亏了答案,这个问题已经解决,但另一个问题出现在函数 onContextItemSelected 的这一行:
this.adapter.notifyDataSetChanged();
我也解决了这个错误,因为适配器也在onCreate函数中定义,所以没有使用全局适配器。 谢谢,祝你有美好的一天!
问题是您定义了 final List<City> ville
两次(一次在主 activity 中,一次在 onCreate 函数中)。您在 onCreate 中将城市添加到本地城市,这就是为什么当您尝试从中删除内容时全局城市为空的原因。
只需删除 onCreate 中的 final List<City> ville = new ArrayList<City>();
行,您的代码就可以正常工作。