I have a ListView in which I load data from SQLite by setting a limit of 3 data from SQLite when scrolling the list I have used AsyncTask to load another 3 data from the database, but when the new data is loaded it shows me an error: ArrayIndexOutOfBoundsException.
Adapter:
public class FarmerAdapter extends BaseAdapter implements Filterable{
    Context context;
    ArrayList<Farmer> farmeritems;
    ArrayList<Farmer> mStringFilterList;
    ValueFilter valueFilter;
    public FarmerAdapter(Context context, ArrayList<Farmer> list) {
        this.context = context;
        farmeritems = list;
        mStringFilterList = list;
    }
    @Override
    public int getCount() {
        return farmeritems.size();
    }
    @Override
    public Object getItem(int position) {
        return farmeritems.get(position);
    }
    @Override
    public long getItemId(int position) {
        return position;
    }
    @Override
    public int getViewTypeCount() {
        return getCount();
    }
    @Override
    public int getItemViewType(int position) {
        return position;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup arg2) {
        Farmer farmerdetails = farmeritems.get(position);
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.model_farmer, null);
        }
        final TextView farmname = (TextView) convertView.findViewById(R.id.tv_farmer_name);
        final TextView farmmobno = (TextView) convertView.findViewById(R.id.tv_farmer_mobno);
        final TextView farmlocation = (TextView) convertView.findViewById(R.id.tv_farmer_location);
        final LinearLayout farmtrade = (LinearLayout) convertView.findViewById(R.id.li_farmer_trade);
        final LinearLayout farmadvance = (LinearLayout) convertView.findViewById(R.id.li_farmer_advance);
        final ImageView img_trade = (ImageView)convertView.findViewById(R.id.img_farmertrade);
        final ImageView img_advance = (ImageView)convertView.findViewById(R.id.img_farmeradvance);
        farmname.setText(farmerdetails.getFarmername());
        farmmobno.setText(farmerdetails.getFarmermobno());
        farmlocation.setText(farmerdetails.getFarmerlocation());
        farmtrade.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                img_trade.setColorFilter(ContextCompat.getColor(context, R.color.colorAccent));
                img_advance.clearColorFilter();
                Intent b = new Intent(context, Farmer_simpletrade_Activity.class);
                b.putExtra("fname", farmname.getText().toString());
                b.putExtra("fmobno", farmmobno.getText().toString());
                context.startActivity(b);
            }
        });
        farmadvance.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                img_advance.setColorFilter(ContextCompat.getColor(context, R.color.colorAccent));
                img_trade.clearColorFilter();
                Intent c = new Intent(context, Farmer_simpleadvance_Activity.class);
                c.putExtra("farmername", farmname.getText().toString());
                c.putExtra("farmermobno", farmmobno.getText().toString());
                context.startActivity(c);
                ((Activity) context).finish();
            }
        });
        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //todo disable the comments for farmer individual transaction
                Intent a = new Intent(context, FarmerLedgerView_Activity.class);
                a.putExtra("farmername", farmname.getText().toString());
                a.putExtra("farmermobno", farmmobno.getText().toString());
                context.startActivity(a);
                ((Activity) context).finish();
            }
        });
        return convertView;
    }
    @Override
    public Filter getFilter() {
        if (valueFilter == null) {
            valueFilter = new ValueFilter();
        }
        return valueFilter;
    }
    private class ValueFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            if (constraint != null && constraint.length() > 0) {
                ArrayList<Farmer> filterList = new ArrayList<Farmer>();
                for (int i = 0; i < mStringFilterList.size(); i++) {
                    if ((mStringFilterList.get(i).getFarmername().toUpperCase())
                            .contains(constraint.toString().toUpperCase())) {
                        Farmer farmer = new Farmer(mStringFilterList.get(i)
                                .getFarmername(), mStringFilterList.get(i)
                                .getFarmermobno(), mStringFilterList.get(i)
                                .getFarmerlocation());
                        filterList.add(farmer);
                    }
                }
                results.count = filterList.size();
                results.values = filterList;
            } else {
                results.count = mStringFilterList.size();
                results.values = mStringFilterList;
            }
            return results;
        }
        @Override
        protected void publishResults(CharSequence constraint,
                                      FilterResults results) {
            farmeritems = (ArrayList<Farmer>) results.values;
            notifyDataSetChanged();
        }
    }
    public void setTransactionList(ArrayList<Farmer> newList) {
        farmeritems = newList;
        notifyDataSetChanged();
    }
}
AsyncTask to load data from background:
  private class LoadDataTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
    }
    @Override
    protected Void doInBackground(Void... params) {
        if (isCancelled()) {
            return null;
        }
        // Simulates a background task
        try {
            Thread.sleep(1000);
            offSet=offSet+3;
            if (offSet > totalcount) {
               loadingMore=false;
            } else {
                Log.e("OffsetNo", String.valueOf(offSet));
                databasehandler = new DatabaseHandler(getApplicationContext());
                farmerlabels = new ArrayList<Farmer>();
                String selectQuery = "SELECT * FROM farmercontactlabel ORDER BY farmername COLLATE NOCASE LIMIT " + offSet + "";
                SQLiteDatabase db = databasehandler.getReadableDatabase();
                Cursor cursor = db.rawQuery(selectQuery, null);
                if (cursor.moveToFirst()) {
                    do {
                        Farmer farmerdetails = new Farmer();
                        farmerdetails.setFarmername(cursor.getString(1));
                        farmerdetails.setFarmermobno(cursor.getString(2));
                        farmerdetails.setFarmerlocation(cursor.getString(3));
                        list.add(farmerdetails);
                    } while (cursor.moveToNext());
                }
                cursor.close();
                db.close();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }
    @Override
    protected void onPostExecute(Void result) {
        fadapter.setTransactionList(list);
        list_farmer.onLoadMoreComplete();
       // fadapter.notifyDataSetChanged();
        super.onPostExecute(result);
    }
    @Override
    protected void onCancelled() {
        // Notify the loading more operation has finished
        list_farmer.onLoadMoreComplete();
    }
}
Database Structure:
 String CREATE_FARMERS_TABLE = "CREATE TABLE " + FARMERCONTACT_LABELS + "("
            + FARMER_ID + " INTEGER,"
            + FARMER_NAME + " TEXT,"
            + FARMER_MOBNO + " NUMERIC PRIMARY KEY,"
            + FARMER_LOCATION + " TEXT" + ");";
    db.execSQL(CREATE_FARMERS_TABLE);
Database:
 public ArrayList<Farmer> getAllfarmers(int offset) {
    ArrayList<Farmer> farmerlabels = new ArrayList<Farmer>();
    String selectQuery = "SELECT * FROM " + FARMERCONTACT_LABELS + " ORDER BY farmername COLLATE NOCASE LIMIT " + offset + "";
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    if (cursor.moveToFirst()) {
        do {
            Farmer farmerdetails = new Farmer();
            farmerdetails.setFarmername(cursor.getString(1));
            farmerdetails.setFarmermobno(cursor.getString(2));
            farmerdetails.setFarmerlocation(cursor.getString(3));
            farmerlabels.add(farmerdetails);
        } while (cursor.moveToNext());
    }
    cursor.close();
    db.close();
    return farmerlabels;
}
Error:
java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:7103)
at android.widget.ListView.layoutChildren(ListView.java:1653)
at android.widget.AbsListView.onLayout(AbsListView.java:2230)
at android.view.View.layout(View.java:16001)
at android.view.ViewGroup.layout(ViewGroup.java:5181)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1195)
at android.view.View.layout(View.java:16001)
                To avoid the ArrayIndexOutOfBoundsException , the following should be kept in mind: The bounds of an array should be checked before accessing its elements. An array in Java starts at index 0 and ends at index length - 1 , so accessing elements that fall outside this range will throw an ArrayIndexOutOfBoundsException .
U are accessing an empty array with some index greater than zero, it returns this error. Solution : Check the array count before you access it through index !
The ArrayIndexOutOfBounds exception is thrown if a program tries to access an array index that is negative, greater than, or equal to the length of the array. The ArrayIndexOutOfBounds exception is a run-time exception. Java's compiler does not check for this error during compilation.
If you're limiting the number of rows to 3, the last index will be 2. So If you try to get by the index 3, you'll get NullPointerException.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With