【问题标题】:How to fix IndexOutOfBoundsException: Index: 1, Size: 1 in android如何修复IndexOutOfBoundsException:索引:1,大小:1在android
【发布时间】:2018-02-13 12:20:01
【问题描述】:

在我的应用程序中,我想从服务器获取一些列表数据并将其设置为 Adapter 以显示项目。 我写了下面的代码,但是在运行时,应用程序向我显示 Force Close 错误并在 Logcat 中显示此错误。

错误信息:

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)

适配器代码:

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);

    }
}
}

我的代码用于从服务器获取数据(对于服务器连接,我使用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) {
        }
    });
}

在适配器中显示此行的错误:

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

我该如何修复这个错误?

【问题讨论】:

    标签: android list arraylist android-adapter


    【解决方案1】:

    将此代码添加到您的活动中

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

    像这样改变你的构造函数

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

    在您的AwardGoldenAdapter 中更改getItemCount() 方法,如下面的代码

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

    【讨论】:

    • 我应该使用 return total 。请帮我解决这个问题
    • @YoYoAnimate 你应该像我的回答一样使用return model.size();
    • 不,她现在确实想显示列表中的每一项,所以 model.size 不正确
    • @LucaNicoletti 如果她使用return total;,则会发生错误
    • 没看到我没有改变构造函数签名,你修好了! :) 对不起,伙计!
    【解决方案2】:

    在活动中试试这个:

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

    并且还改变适配器如下:

    public AwardGoldenAdapter(Context context, List<Award> model) {
       this.context = context;
       this.model = model;
    }
    
    @Override
    public int getItemCount() {
        return this.model.size();
    }
    

    【讨论】:

      【解决方案3】:

      要消除您的错误,只需更改 getItemCount() . 中的一条语句 返回模型.size()

      【讨论】:

      • 我应该使用 return total 。请帮我解决这个问题
      • 使用只能显示一次。
      【解决方案4】:

      只需添加 notifyDataSetChanged();删除或添加后添加到您的代码中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-28
        • 2019-02-01
        • 2016-10-09
        • 1970-01-01
        • 2020-10-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多