0

먼저 영어가 아니기 때문에 실수를하면 사과드립니다.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();

내가 너무이 오류를 해결 세계적인 것은 사용되지 않았다. 감사합니다. 좋은 하루 되세요!

+0

확인해주세요. ans : http://stackoverflow.com/questions/9795507/deleting-items-from-listview-with-a-contextmenu-in-android?rq=1 –

답변

0

final List<City> ville을 두 번 (주 활동에서 한 번, onCreate 함수에서 한 번) 정의한 것이 문제입니다. 도시를 onCreate의 로컬에 추가하면, 전역을 제거하려고 할 때 전역이 비어있는 것입니다.

onCreate에서 라인 final List<City> ville = new ArrayList<City>(); 만 제거하면 코드가 작동합니다.

+0

팁 주셔서 감사합니다. 왜 내가 전에 그것을 보지 못했는지 모르겠다.이 줄 뒤에 다른 버그를 발견했다 :'this.adapter.notifyDataSetChanged();'nullPointerException이 발생했다. onCreate에서 정의했기 때문에 동일한 문제가 발생하므로 전역 어댑터가 사용되지 않았습니다. 고마워요, 모든 것이 지금 작동합니다! –

관련 문제