0

最初に私は英語ではないので、言語ミスを犯した場合は謝罪します。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();

は、私は、あまりにもこのエラーを解決グローバルなものは使用されなかった。 ありがとう、良い一日を!

+0

これを確認してください:http://stackoverflow.com/questions/9795507/deleting-items-from-listview-with-a-contentmenu-in-android?rq=1 –

答えて

0

問題はfinal List<City> villeを2回(メインアクティビティで1回、onCreate関数で1回)定義したことです。あなたはonCreateのローカルのものに都市を追加します。なぜなら、グローバルなものを削除しようとすると、それが空であるからです。

onCreateのfinal List<City> ville = new ArrayList<City>();行を削除するだけでコードが機能します。

+0

あなたのヒントのために働いてくれてありがとう、なぜ私はそれを見ていないのかわかりません...この行には、次のようなバグがありました: 'this.adapter.notifyDataSetChanged();' nullPointerExceptionがありました。 onCreateで定義したので同じ問題が発生したので、グローバルな 'アダプタは使用されませんでした。ありがとう、すべての作品は今すぐ! –

関連する問題