user8510560
user8510560

Reputation:

How to fix IndexOutOfBoundsException: Index: 1, Size: 1 in android

In my application I want to get some list data from server and set this into Adapter for show items. I write below codes, but when run, the application shows me a Force Close error and show this error in Logcat.

Error Message :

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.get(ArrayList.java:437)
at app.test.Adapters.CelebrityDetailAdapter.AwardGoldenAdapter.onBindViewHolder(AwardGoldenAdapter.java:53)
at app.test.Adapters.CelebrityDetailAdapter.AwardGoldenAdapter.onBindViewHolder(AwardGoldenAdapter.java:23)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6356)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6389)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5335)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5598)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5440)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5436)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2224)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1551)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3583)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3312)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3844)
at android.view.View.layout(View.java:19393)
at android.view.ViewGroup.layout(ViewGroup.java:6022)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080)
at android.view.View.layout(View.java:19393)
at android.view.ViewGroup.layout(ViewGroup.java:6022)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080)

Adapter code:

public class AwardGoldenAdapter extends    RecyclerView.Adapter<AwardGoldenAdapter.ViewHolder> {

private Context context;
private List<Award> model;
private int modelImage;
private int won, nominated, total;

public AwardGoldenAdapter(Context context, List<Award> model, int won, int nominated) {
    this.context = context;
    this.model = model;
    this.won = won;
    this.nominated = nominated;

    if (won > 0) {
        total = won;
    } else {
        total = nominated;
    }
}

@Override
public AwardGoldenAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_award, parent, false);

    return new AwardGoldenAdapter.ViewHolder(view);
}

@Override
public void onBindViewHolder(final AwardGoldenAdapter.ViewHolder holder, final int position) {

    if (model.get(position).getWon()) {
        modelImage = R.drawable.golden_globe_gold;
    } else {
        modelImage = R.drawable.golden_globe_silver;
    }
    Glide.with(context)
            .load(modelImage)
            .placeholder(R.drawable.default_image)
            .diskCacheStrategy(DiskCacheStrategy.SOURCE)
            .into(holder.row_awardImg);
}

@Override
public int getItemCount() {
    return total;
}

public class ViewHolder extends RecyclerView.ViewHolder {

    private ImageView row_awardImg;

    public ViewHolder(View itemView) {
        super(itemView);

        row_awardImg = (ImageView) itemView.findViewById(R.id.row_awardImg);

    }
}
}

My codes in activity for get data from server (for server connection I use Retrofit) :

    private void getGoldenGlobeData() {
    celebrityAwardSendData = new CelebrityAwardSendData();
    celebrityAwardSendData.setCelebrityID(celebrityID);

    InterfaceApi api = ApiClient.getClient().create(InterfaceApi.class);
    Call<CelebrityAwardResponse> call = api.getCelebrityAward(celebrityAwardSendData);

    call.enqueue(new Callback<CelebrityAwardResponse>() {
        @Override
        public void onResponse(Call<CelebrityAwardResponse> call, Response<CelebrityAwardResponse> response) {
            if (response.body().getData() != null) {
                awardModel.clear();
                List<Award> won = new ArrayList<>();
                List<Award> lost = new ArrayList<>();
                for (Award award : response.body().getData().get(1).getAwards()) {
                    if (!award.getWon()) {
                        lost.add(award);
                    } else {
                        won.add(award);
                    }
                }
                if (won.size() > 0) {
                    awardModel.addAll(won);
                } else {
                    awardModel.addAll(lost);
                }

                awardGoldenAdapter = new AwardGoldenAdapter(context, awardModel, won.size(), lost.size());
                infoMovieFrag_AwardGoldenRecyclerView.setLayoutManager(new LinearLayoutManager
                        (context, LinearLayoutManager.HORIZONTAL, false));
                infoMovieFrag_AwardGoldenRecyclerView.setHasFixedSize(true);
                infoMovieFrag_AwardGoldenRecyclerView.setNestedScrollingEnabled(false);
                infoMovieFrag_AwardGoldenRecyclerView.addOnItemTouchListener(disableRecyclerViewScroll);
                infoMovieFrag_AwardGoldenRecyclerView.setAdapter(awardGoldenAdapter);
            }
        }

        @Override
        public void onFailure(Call<CelebrityAwardResponse> call, Throwable t) {
        }
    });
}

Show me error for this line in Adapter :

if (model.get(position).getWon()) {

How can I fix this bug?

Upvotes: 1

Views: 9277

Answers (4)

hana rahmati
hana rahmati

Reputation: 85

just add notifyDataSetChanged(); to your code after delete or add

Upvotes: 1

Luca Nicoletti
Luca Nicoletti

Reputation: 2417

Try this in the Activity:

if (won.size() > 0) {
   awardModel.addAll(won);
   awardGoldenAdapter = new AwardGoldenAdapter(context, awardModel);
} else {
   awardModel.addAll(lost);
   awardGoldenAdapter = new AwardGoldenAdapter(context, awardModel);
}

And also change the adapter as follow:

public AwardGoldenAdapter(Context context, List<Award> model) {
   this.context = context;
   this.model = model;
}

@Override
public int getItemCount() {
    return this.model.size();
}

Upvotes: 2

AskNilesh
AskNilesh

Reputation: 69699

add this code in your activity

 if (won.size() > 0) {
       awardModel.addAll(won);
       awardGoldenAdapter = new AwardGoldenAdapter(context, awardModel);
    } else {
       awardModel.addAll(lost);
       awardGoldenAdapter = new AwardGoldenAdapter(context, awardModel);
    }

and change your constructor like this

public AwardGoldenAdapter(Context context, List<Award> model) {
    this.context = context;
    this.model = model;
}

change getItemCount() method in your AwardGoldenAdapter like below code

@Override
public int getItemCount() {
    return model.size();
}

Upvotes: 3

Zezariya Nilesh
Zezariya Nilesh

Reputation: 400

To remove your error just change one statement inside getItemCount() . return model.size()

Upvotes: 2

Related Questions