我正在使用android,但我遇到了问题而且我不知道如何解决我的问题。这是我的问题:
java.lang.IndexOutOfBoundsException: Invalid index 2131689663, size is 5.
所以我用logcat检查过这些文件有问题:
at mislugares.example.com.mislugares.LugaresVector.actualiza(LugaresVector.java:41)
at mislugares.example.com.mislugares.EdicionLugarActivity.onOptionsItemSelected(EdicionLugarActivity.java:76)
这是LugaresVector.java的代码
public class LugaresVector implements Lugares {
protected List<Lugar> vectorLugares = ejemploLugares();
public LugaresVector(){
vectorLugares = ejemploLugares();
}
public Lugar elemento(int id ){
return vectorLugares.get(id);
}
public void anhade(Lugar lugar){
vectorLugares.add(lugar);
}
public int nuevo(){
Lugar lugar = new Lugar();
vectorLugares.add(lugar);
return vectorLugares.size()-1;
}
public void borrar(int id){
vectorLugares.remove(id);
}
public int tamanho(){
return vectorLugares.size();
}
public void actualiza(int id, Lugar lugar){
vectorLugares.set(id,lugar); //This is the problem with logcat
}
public static ArrayList<Lugar> ejemploLugares() {
ArrayList<Lugar> lugares = new ArrayList<Lugar>();
lugares.add(new Lugar("Escuela Politecnica Superior de Gandia", "C/ Paranimf, 1 46730 Gandia (SPAIN)",
-0.166093, 38.995656,TipoLugar.EDUCACION,962849300, "http://www.epsg.upv.es",
"Uno de los mejores lugares para formarse.",3));
lugares.add(new Lugar("Al de siempre",
"P.Industrial Junto Molí Nou - 46722, Benifla (Valencia)",
-0.190642, 38.925857, TipoLugar.BAR, 636472405, "",
"No te pierdas el arroz en calabaza.", 3));
lugares.add(new Lugar("androidcurso.com",
"ciberespacio", 0.0, 0.0, TipoLugar.EDUCACION,
962849300, "http://androidcurso.com",
"Amplia tus conocimientos sobre Android.", 5));
lugares.add(new Lugar("Barranco del Infierno",
"Vía Verde del río Serpis. Villalonga (Valencia)",
-0.295058, 38.867180, TipoLugar.NATURALEZA, 0,
"http://sosegaos.blogspot.com.es/2009/02/lorcha-villalonga-via-"+
"verde-del-rio.html","Espectacular ruta para bici o andar", 4));
lugares.add(new Lugar("La Vital",
"Avda. de La Vital, 0 46701 Gandía (Valencia)", -0.1720092,
38.9705949, TipoLugar.COMPRAS, 962881070,
"http://www.lavital.es/", "El típico centro comercial", 2));
return lugares;
}
这是EdicionLugarActivity的代码
public class EdicionLugarActivity extends AppCompatActivity {
Lugar lugar = new Lugar();
private EditText nombre;
private Spinner tipo;
private EditText direccion;
private EditText telefono;
private EditText url;
private EditText comentario;
public void onCreate(Bundle savedInstance){
super.onCreate(savedInstance);
setContentView(R.layout.edicion_lugar);
nombre = (EditText)findViewById(R.id.edit_nombre);
nombre.setText(lugar.getNombre());
tipo = (Spinner) findViewById(R.id.tipo);
ArrayAdapter<String> adaptor = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_item, TipoLugar.getNombres());
adaptor.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
tipo.setAdapter(adaptor);
tipo.setSelection(lugar.getTipo().ordinal());
direccion = (EditText)findViewById(R.id.edit_direccion);
direccion.setText(lugar.getDireccion());
telefono = (EditText)findViewById(R.id.edit_telefono);
telefono.setText(Integer.toString(lugar.getTelefono()));
url = (EditText)findViewById(R.id.edit_url);
url.setText(lugar.getUrl());
comentario = (EditText)findViewById(R.id.edit_comentarios);
comentario.setText(lugar.getComentario());
}
public boolean onCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu.edicion_lugar, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item){
long id = item.getItemId();`enter code here`
if(id == R.id.menu_guardar){
lugar.setNombre(nombre.getText().toString());
lugar.setTipo(TipoLugar.values()[tipo.getSelectedItemPosition()]);
lugar.setDireccion(direccion.getText().toString());
lugar.setTelefono(Integer.parseInt(telefono.getText().toString()));
lugar.setUrl(url.getText().toString());
lugar.setComentario(comentario.getText().toString());
MainActivity.lugares.actualiza((int)id,lugar); //This is the problem with logcat
finish();
}
if(id == R.id.menu_cancelar){
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
}
那么,有人可以给我一些建议或答案吗?
答案 0 :(得分:0)
你的问题是
java.lang.IndexOutOfBoundsException:索引2131689663无效,大小为5.
因此,您传递的索引不能大于5。
您可以重新声明ID,然后在单击按钮时指定值,然后在MainActivity
处理它。
youRID
可以使用0,1,2,3,4
作为索引。
private int yourId;
public boolean onOptionsItemSelected(MenuItem item) {
long id = item.getItemId();`enter code here`
if (id == R.id.menu_guardar) {
yourId = 1;
lugar.setNombre(nombre.getText().toString());
lugar.setTipo(TipoLugar.values()[tipo.getSelectedItemPosition()]);
lugar.setDireccion(direccion.getText().toString());
lugar.setTelefono(Integer.parseInt(telefono.getText().toString()));
lugar.setUrl(url.getText().toString());
lugar.setComentario(comentario.getText().toString());
// edited here
MainActivity.lugares.actualiza(yourId, lugar);
finish();
}
if (id == R.id.menu_cancelar) {
yourId = 2;
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
答案 1 :(得分:0)
这是因为您尝试使用以下新元素替换vectorLugares
列表中指定位置的元素:
long id = item.getItemId();
...
MainActivity.lugares.actualiza((int)id, lugar);
列表来自以下代码:
protected List<Lugar> vectorLugares = ejemploLugares();
...
public void actualiza(int id, Lugar lugar) {
vectorLugares.set(id,lugar);
}
但它不会起作用,因为item.getItemId()
超出了您的列表大小(大小为5),其中项ID是Android Studio自动生成的整数。
您的列表大小仅为您之前在以下方法中定义的位置:
public static ArrayList<Lugar> ejemploLugares() {
ArrayList<Lugar> lugares = new ArrayList<Lugar>();
// here you're adding 5 items.
return lugares;
}
您可以通过将每个菜单ID与索引映射来解决此问题。像这样:
public boolean onOptionsItemSelected(MenuItem item){
long id = item.getItemId();
if (id == R.id.menu_guardar) {
...
MainActivity.lugares.actualiza(1, lugar);
...
} else if (id == R.id.menu_cancelar) {
...
MainActivity.lugares.actualiza(2, lugar);
...
}
return super.onOptionsItemSelected(item);
}