Komang Putra Ответов: 1

Индекс находится вне границ, когда удаление


Когда я удаляю элемент автоматически, мое приложение принудительно закрывается из-за отсутствия привязки индекса
Итак вот мой код
<pre>package com.example.eis2;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.example.eis2.Item.approvalnonfullmodel;
import com.example.eis2.R;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

import static com.example.eis2.Item.LoginItem.KEY_NIK;
import static com.example.eis2.izin.txt_jabatan;
import static com.example.eis2.izin.txt_nomor;

public class approval_nonfull extends AppCompatActivity {
    public ListView listok;
    private List<approvalnonfullmodel> movieItemList;
    Button notapprove, approve;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_approval_nonfull);
        listok = findViewById(R.id.list);

        movieItemList = new ArrayList<>();
        notapprove = (Button) findViewById(R.id.notapprove);
        notapprove.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(approval_nonfull.this, nonfull_noapprove.class);
                startActivity(i);
            }
        });

        approve = (Button) findViewById(R.id.approve);
        approve.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(approval_nonfull.this, nonfull_yesapprove.class);
                startActivity(i);
            }
        });
        fullday();
    }

    private void fullday() {
        String lokasi = txt_nomor.getText().toString().trim();
        System.out.println("Test" + lokasi);


        StringRequest stringRequest = new StringRequest(Request.Method.GET, "...",
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {

                        try {
                            JSONObject obj = new JSONObject(response);
                            final JSONArray movieArray = obj.getJSONArray("data");

                            JSONObject movieObject = null;
                            for (int i = 0; i < movieArray.length(); i++) {

                                movieObject = movieArray.getJSONObject(i);

                                final approvalnonfullmodel movieItem = new approvalnonfullmodel(
                                        movieObject.getString("id_non_full"),
                                        movieObject.getString("no_pengajuan_non_full"),
                                        movieObject.getString("tanggal_pengajuan"),
                                        movieObject.getString("lokasi_struktur"),
                                        movieObject.getString("nama_karyawan_struktur"),
                                        movieObject.getString("jenis_non_full"),
                                        movieObject.getString("tanggal_non_full"),
                                        movieObject.getString("ket_tambahan_non_full"),
                                        movieObject.getString("status_non_full"),
                                        movieObject.getString("feedback_non_full"));

                                movieItemList.add(movieItem);

                            }
                            final ListViewAdapterApprovalNonFull adapter = new  ListViewAdapterApprovalNonFull(movieItemList, getApplicationContext());

                            listok.setAdapter(adapter);
                            listok.setStackFromBottom(true);

                            listok.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                                @Override
                                public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                                    Intent i = new Intent(approval_nonfull.this, form_nonfull.class);
                                    String idkaryawan = ((approvalnonfullmodel) parent.getItemAtPosition(position)).getId_non_full();
                                    i.putExtra(KEY_NIK, idkaryawan);
                                    startActivity(i);
                                }
                            });


                            adapter.notifyDataSetChanged();

                        } catch (JSONException e) {
                            e.printStackTrace();

                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(getApplicationContext(), "Belum ada pengajuan", Toast.LENGTH_SHORT).show();
                    }
                });


        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }
    public void refreshActivity() {
        Intent i = new Intent(this, approval_izin.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(i);
        finish();
    }
    @Override
    public void onBackPressed() {
        refreshActivity();
        super.onBackPressed();
    }
    public class ListViewAdapterApprovalNonFull extends ArrayAdapter<approvalnonfullmodel> {
        private List<approvalnonfullmodel> movieItemList;

        private Context context;

        public ListViewAdapterApprovalNonFull(List<approvalnonfullmodel> movieItemList, Context context) {
            super(context, R.layout.list_item_approval_nonfull, movieItemList);
            this.movieItemList = movieItemList;
            this.context = context;
        }
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {

            LayoutInflater inflater = LayoutInflater.from(context);

            View listViewItem = inflater.inflate(R.layout.list_item_approval_nonfull, null, true);

            TextView id = listViewItem.findViewById(R.id.id);
            TextView nama = listViewItem.findViewById(R.id.nama);
            TextView lokasi = listViewItem.findViewById(R.id.lokasi);
            TextView jenis = listViewItem.findViewById(R.id.jenis);
            TextView tanggal = listViewItem.findViewById(R.id.tanggal);
            TextView keterangan = listViewItem.findViewById(R.id.keterangan);
            TextView status = listViewItem.findViewById(R.id.status);
            TextView feedback = listViewItem.findViewById(R.id.feedback);

            approvalnonfullmodel movieItem = movieItemList.get(position);

            id.setText(movieItem.getId_non_full());
            nama.setText(movieItem.getNama_karyawan_struktur());
            lokasi.setText(movieItem.getLokasi_struktur());
            jenis.setText(movieItem.getJenis_non_full());
            tanggal.setText(movieItem.getTanggal_non_full());
            keterangan.setText(movieItem.getKet_tambahan_non_full());
            status.setText(movieItem.getStatus_non_full());
            feedback.setText(movieItem.getFeedback_non_full());

            if(!txt_jabatan.getText().toString().equals(lokasi.getText().toString())){
                movieItemList.remove(position);
                this.notifyDataSetChanged();
            }
            if ("0".equals(status.getText().toString())) {
                status.setText("Menunggu Atasan");
                this.notifyDataSetChanged();
            }

            if("1".equalsIgnoreCase(status.getText().toString()) || "2".equalsIgnoreCase(status.getText().toString()) || "3".equalsIgnoreCase(status.getText().toString())) {
                movieItemList.remove(position);
                listViewItem.setVisibility(View.INVISIBLE);
                this.notifyDataSetChanged();
            }

            return listViewItem;
        }
    }
}


Что я уже пробовал:

Этот код используется для удаления и получения позиции

<pre>public class ListViewAdapterApprovalNonFull extends ArrayAdapter<approvalnonfullmodel> {
        private List<approvalnonfullmodel> movieItemList;

        private Context context;

        public ListViewAdapterApprovalNonFull(List<approvalnonfullmodel> movieItemList, Context context) {
            super(context, R.layout.list_item_approval_nonfull, movieItemList);
            this.movieItemList = movieItemList;
            this.context = context;
        }
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {

            LayoutInflater inflater = LayoutInflater.from(context);

            View listViewItem = inflater.inflate(R.layout.list_item_approval_nonfull, null, true);

            TextView id = listViewItem.findViewById(R.id.id);
            TextView nama = listViewItem.findViewById(R.id.nama);
            TextView lokasi = listViewItem.findViewById(R.id.lokasi);
            TextView jenis = listViewItem.findViewById(R.id.jenis);
            TextView tanggal = listViewItem.findViewById(R.id.tanggal);
            TextView keterangan = listViewItem.findViewById(R.id.keterangan);
            TextView status = listViewItem.findViewById(R.id.status);
            TextView feedback = listViewItem.findViewById(R.id.feedback);

            approvalnonfullmodel movieItem = movieItemList.get(position);

            id.setText(movieItem.getId_non_full());
            nama.setText(movieItem.getNama_karyawan_struktur());
            lokasi.setText(movieItem.getLokasi_struktur());
            jenis.setText(movieItem.getJenis_non_full());
            tanggal.setText(movieItem.getTanggal_non_full());
            keterangan.setText(movieItem.getKet_tambahan_non_full());
            status.setText(movieItem.getStatus_non_full());
            feedback.setText(movieItem.getFeedback_non_full());

            if(!txt_jabatan.getText().toString().equals(lokasi.getText().toString())){
                movieItemList.remove(position);
                this.notifyDataSetChanged();
            }
            if ("0".equals(status.getText().toString())) {
                status.setText("Menunggu Atasan");
                this.notifyDataSetChanged();
            }

            if("1".equalsIgnoreCase(status.getText().toString()) || "2".equalsIgnoreCase(status.getText().toString()) || "3".equalsIgnoreCase(status.getText().toString())) {
                movieItemList.remove(position);
                listViewItem.setVisibility(View.INVISIBLE);
                this.notifyDataSetChanged();
            }

            return listViewItem;
        }
    }
}


когда он удаляет элемент, приложение принудительно закрывается вот это сообщение об ошибке :
java.lang.IndexOutOfBoundsException: Index: 945, Size: 945
       at java.util.ArrayList.remove(ArrayList.java:503)
       at com.example.eis2.approval_nonfull$ListViewAdapterApprovalNonFull.getView(approval_nonfull.java:197)


Итак ... главная причина в том, что
if("1".equalsIgnoreCase(status.getText().toString()) || "2".equalsIgnoreCase(status.getText().toString()) || "3".equalsIgnoreCase(status.getText().toString())) {
                movieItemList.remove(position); -------> this is the problem
                listViewItem.setVisibility(View.INVISIBLE);
                this.notifyDataSetChanged();
            }


ребята, вы можете решить эту проблему ? я ценю это....

David Crow

Похоже, вы звоните в полицию. remove() метод дважды использует одно и то же значение position с каждым.

Komang Putra

Итак ... я должен вызвать метод remove только один раз ?

David Crow

Только ты можешь знать ответ на этот вопрос. Посмотри на этих двоих if() условия, определяющие, следует ли удалять элемент или нет. По-видимому, они не связаны между собой. Возможно второе if() может быть else if() вместо этого?

1 Ответов

Рейтинг:
2

Patrice T

Цитата:
Индекс находится вне границ, когда удаление

Сообщение об ошибке также сообщит вам, где находится ошибка. Хорошая идея, чтобы рассказать нам тоже.
Совет: используйте отладчик, он позволит вам проверять переменные при возникновении ошибки.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

jdb - отладчик Java[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.

[Обновление]
Цитата:
Ява.яз.IndexOutOfBoundsException: Index: 945, Size: 945

Это означает, что movieItemList имейте 945 элементов, и поскольку Java основана на нуле, позиции находятся от 0 до 944. Вы пытаетесь удалить элемент номер 945, который не существует.
Вы должны найти, почему это происходит.
if(!txt_jabatan.getText().toString().equals(lokasi.getText().toString())){
    movieItemList.remove(position); // Is it possible that this remove was done before the error ?
    this.notifyDataSetChanged();
}
if ("0".equals(status.getText().toString())) {
    status.setText("Menunggu Atasan");
    this.notifyDataSetChanged();
}

if("1".equalsIgnoreCase(status.getText().toString()) || "2".equalsIgnoreCase(status.getText().toString()) || "3".equalsIgnoreCase(status.getText().toString())) {
    movieItemList.remove(position); // error is here
    listViewItem.setVisibility(View.INVISIBLE);
    this.notifyDataSetChanged();
}


David Crow

Как именно это решение, а не просто полезное предложение? Разве ОП не должен определить, является ли ваше предложение достойным решения или нет? Просто любопытно...

Patrice T

ОП добавил полезную информацию после этого решения.