Reputation:
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
Reputation: 85
just add notifyDataSetChanged(); to your code after delete or add
Upvotes: 1
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
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
Reputation: 400
To remove your error just change one statement inside getItemCount() .
return model.size()
Upvotes: 2