먼저 영어가 아니기 때문에 실수를하면 사과드립니다.Android - ContextMenu를 사용하여 ListView의 객체를 삭제하십시오.
편집 : 해결.
간단한 날씨 애플리케이션을 코딩하려고합니다. 도시리스트가 있는데 그 중 하나를 누르면 기온 등에 관한 더 많은 정보를 얻을 수 있습니다. 모든 정보가있는 City 클래스가 있습니다. ListView가 잘 작동하고 있으며 도시를 선택하면 정보가 정확합니다.
다음 단계에서는 ContextMenu를 사용하여 목록에서 도시를 삭제하고 싶습니다.
긴 클릭이 발생하면 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;
}
}
내가 문제는 내가 삭제 옳은 일을 찾지 못했음을 생각 .. 감사 : 여기
내 코드입니다 너 내 게시물을 읽고있어!좋은 하루 보내십시오.
편집 : 답변 덕분에이 문제가 해결되지만, 기능에 대한이 라인에서 다른 나타난다는 onContextItemSelected : 어댑터도 그래서에서 onCreate 함수에 정의되어 있기 때문에
this.adapter.notifyDataSetChanged();
내가 너무이 오류를 해결 세계적인 것은 사용되지 않았다. 감사합니다. 좋은 하루 되세요!
확인해주세요. ans : http://stackoverflow.com/questions/9795507/deleting-items-from-listview-with-a-contextmenu-in-android?rq=1 –