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>(); 行,您的代码就可以正常工作。