java.lang.IndexOutOfBoundsException:索引2131689663无效,大小为5

时间:2017-10-30 02:25:42

标签: android

我正在使用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);
    }
}

那么,有人可以给我一些建议或答案吗?

2 个答案:

答案 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);
}