When i remove item automatic, my app is force close because of index out of bound
so here is my code
<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;
}
}
}
What I have tried:
This code is use for remove and getting position
<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;
}
}
}
when it removes item, the app is force closed here is the error message :
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)
so.. the main cause is
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();
}
can you guys solve this problem ? i appreciate that....