最初に私は英語ではないので、言語ミスを犯した場合は謝罪します。Android - ContextMenuを使用してListViewのオブジェクトを削除する
EDIT:解決済み。
私は単純な天気アプリケーションをコーディングしようとしています。都市のリストがあり、あなたがそれらの1つを押すと、温度などの詳細情報が得られます。 すべての情報があるCityクラスがあります。 ListViewは正常に動作しています。都市を選択すると、情報が正確になります。
次のステップでは、ContextMenuを使用してリストから都市を削除したいとします。
長いクリックが発生したときにContextMenuを表示させることはできますが、削除ボタンを押したときに私のコードが正しくないため、アイテムを削除できません:とアプリが強制終了します。ここで
は私のコードです:
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;
}
}
私は、問題は、私は削除する正しいことを見つけられませんでしたということだと思います。.. 感謝あなたは私のポストを読むために!
良い一日を。
編集:答えのおかげで、この問題は解決されていますが、機能上、このラインで別の現れではonContextItemSelected:アダプターはまたそうのonCreate機能で定義されたため、
this.adapter.notifyDataSetChanged();
は、私は、あまりにもこのエラーを解決グローバルなものは使用されなかった。 ありがとう、良い一日を!
これを確認してください:http://stackoverflow.com/questions/9795507/deleting-items-from-listview-with-a-contentmenu-in-android?rq=1 –