Индекс находится вне границ, когда удаление
Когда я удаляю элемент автоматически, мое приложение принудительно закрывается из-за отсутствия привязки индекса
Итак вот мой код
<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()
вместо этого?