【问题标题】:RecyclerView gets IndexOutOfBoundsException when Scrolling (Retrofit2 + Library Section RecyclerView)RecyclerView 在滚动时获取 IndexOutOfBoundsException (Retrofit2 + Library Section RecyclerView)
【发布时间】:2019-05-25 19:19:28
【问题描述】:

我想让 recyclerview 部分显示来自 mysql 数据库的 4 个数据。我使用了一个包含多个引用的库,当数据是虚拟的时它没有问题,但是当我将其更改为从数据库中获取的数据时,我得到一个 IndexOutOfBoundsException: Index: 5, Size: 5 Is我有解决办法吗?

这是一个例外:

2018-12-28 03:00:51.988 7929-7929/rifafauzi6.id.sectionrecyclerview E/AndroidRuntime: FATAL EXCEPTION: main
Process: rifafauzi6.id.sectionrecyclerview, PID: 7929
java.lang.IndexOutOfBoundsException: Index: 5, Size: 5
    at java.util.ArrayList.set(ArrayList.java:427)
    at rifafauzi6.id.sectionrecyclerview.adapter.QuestionAdapter.onBindItemViewHolder(QuestionAdapter.java:76)
    at io.github.luizgrp.sectionedrecyclerviewadapter.Section.onBindContentViewHolder(Section.java:295)
    at io.github.luizgrp.sectionedrecyclerviewadapter.SectionedRecyclerViewAdapter.onBindViewHolder(SectionedRecyclerViewAdapter.java:293)
    at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6673)
    at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6714)
    at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5647)
    at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5913)
    at android.support.v7.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:285)
    at android.support.v7.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:342)
    at android.support.v7.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:358)
    at android.support.v7.widget.GapWorker.prefetch(GapWorker.java:365)
    at android.support.v7.widget.GapWorker.run(GapWorker.java:396)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

这里是 QuestionAdapter.java 的代码:

public class QuestionAdapter extends StatelessSection {

private String title;
private List<Question> listQuestion;
private Context context;

private LayoutInflater inflter;
public static ArrayList<String> kdPertanyaan;
public static ArrayList<String> kdKuesioner;
public static ArrayList<String> selectedAnswers;

public QuestionAdapter(Context context, String title, List<Question> listQuestion) {
    super(SectionParameters.builder()
            .itemResourceId(R.layout.list_pertanyaan)
            .headerResourceId(R.layout.list_title)
            .build());
    this.context = context;
    this.title = title;
    this.listQuestion = listQuestion;
    kdPertanyaan = new ArrayList<>();
    for (int i = 0; i < listQuestion.size(); i++) {
        kdPertanyaan.add("Nilai tidak boleh kosong");
    }
    kdKuesioner = new ArrayList<>();
    for (int i = 0; i < listQuestion.size(); i++) {
        kdKuesioner.add("Nilai tidak boleh kosong");
    }
    selectedAnswers = new ArrayList<>();
    for (int i = 0; i < listQuestion.size(); i++) {
        selectedAnswers.add("Jawaban tidak boleh kosong");
    }

    inflter = (LayoutInflater.from(context));
}

public void setListQuestion(List<Question> listQuestion) {
    this.listQuestion = listQuestion;
}

@Override
public int getContentItemsTotal() {
    return listQuestion.size();
}

@Override
public RecyclerView.ViewHolder getItemViewHolder(View view) {
    return new ItemViewHolder(view);
}

@Override
public void onBindItemViewHolder(RecyclerView.ViewHolder holder, final int position) {
    final ItemViewHolder itemHolder = (ItemViewHolder) holder;
    Question question = listQuestion.get(position);
    itemHolder.txtKdPertanyaan.setText(kdPertanyaan.set(position, question.getKd_pertanyaan()));
    itemHolder.txtKdKuesioner.setText(kdKuesioner.set(position, question.getKd_kuesioner()));
    itemHolder.txtNo.setText(question.getNo());
    itemHolder.txtPertanyaan.setText(question.getPertanyaan());
    itemHolder.question = question;
    itemHolder.rb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // set Yes values in ArrayList if RadioButton is checked
            if (isChecked)
                selectedAnswers.set(position, "1");
        }
    });

    itemHolder.rb3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // set Yes values in ArrayList if RadioButton is checked
            if (isChecked)
                selectedAnswers.set(position, "3");
        }
    });

    itemHolder.rb5.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // set Yes values in ArrayList if RadioButton is checked
            if (isChecked)
                selectedAnswers.set(position, "5");
        }
    });

    itemHolder.rb7.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // set Yes values in ArrayList if RadioButton is checked
            if (isChecked)
                selectedAnswers.set(position, "7");
        }
    });

}

@Override
public RecyclerView.ViewHolder getHeaderViewHolder(View view) {
    return new HeaderViewHolder(view);
}

@Override
public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) {
    HeaderViewHolder headerHolder = (HeaderViewHolder) holder;

    headerHolder.tvTitle.setText(title);
}

class HeaderViewHolder extends RecyclerView.ViewHolder {

    @BindView(R.id.tvTitle) TextView tvTitle;

    HeaderViewHolder(View view) {
        super(view);
        ButterKnife.bind(this, view);
    }
}

class ItemViewHolder extends RecyclerView.ViewHolder {

    @BindView(R.id.kd_pertanyaan) TextView txtKdPertanyaan;
    @BindView(R.id.kd_kuesioner) TextView txtKdKuesioner;
    @BindView(R.id.no) TextView txtNo;
    @BindView(R.id.question) TextView txtPertanyaan;
    @BindView(R.id.rbValueOf1) RadioButton rb1;
    @BindView(R.id.rbValueOf3) RadioButton rb3;
    @BindView(R.id.rbValueOf5) RadioButton rb5;
    @BindView(R.id.rbValueOf7) RadioButton rb7;

    Question question;
    ItemViewHolder(View view) {
        super(view);
        ButterKnife.bind(this, view);
    }
}

}

这是显示数据的代码:

public class MainActivity extends AppCompatActivity {

@BindView(R.id.rv_pertanyaan) RecyclerView rvPertanyaan;
ProgressDialog loading;

private SectionedRecyclerViewAdapter sectionAdapter;

String KS01 = "KS01";
String KS02 = "KS02";
String KS03 = "KS03";
String KS04 = "KS04";

String titleA = "A. Kompetensi Pedagogik : kemampuan mengelola proses pembelajaran mahasiswa.";
String titleB = "B. Kompetensi Profesional : kemampuan penguasaan materi pelajaran secara luas dan mendalam.";
String titleC = "C. Kompetensi Kepribadian : kemampuan kepribadian yang mantap, berakhlak mulia, arif, dan berwibawa serta menjadi teladan mahasiswa.";
String titleD = "D. Kompetensi Sosial : kemampuan berkomunikasi dan berinteraksi secara efektif dan efisien dengan mahasiswa, sesama dosen, orangtua/wali, dan masyarakat sekitar";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    sectionAdapter = new SectionedRecyclerViewAdapter();

    loading = new ProgressDialog(this);
    ButterKnife.bind(this);

    callQuestion1(KS01);
    callQuestion2(KS02);
    callQuestion3(KS03);
    callQuestion4(KS04);

    rvPertanyaan.setLayoutManager(new LinearLayoutManager(this));
    rvPertanyaan.setHasFixedSize(true);
    rvPertanyaan.setAdapter(sectionAdapter);

}

private void callQuestion1(String kd_pertanyaan){
    loading.setMessage("Loading ...");
    loading.setCancelable(false);
    loading.show();
    BaseApiService apiService = Server.getUrl().create(BaseApiService.class);
    Call<ResponsModelQuestion> getdata = apiService.getPertanyaan(kd_pertanyaan);
    getdata.enqueue(new Callback<ResponsModelQuestion>() {
        @Override
        public void onResponse(@NonNull Call<ResponsModelQuestion> call, @NonNull Response<ResponsModelQuestion> response) {
            if (response.isSuccessful()){
                loading.dismiss();
                Log.d("onResponse", "Message : " + Objects.requireNonNull(response.body()).getKode());
                List<Question> listPertanyaan = response.body().getResult();

                QuestionAdapter adapter = new QuestionAdapter(getApplicationContext(), titleA, listPertanyaan);
                adapter.setListQuestion(listPertanyaan);
                sectionAdapter.addSection(adapter);
                rvPertanyaan.setAdapter(sectionAdapter);
            }
            else {
                loading.dismiss();
                Toast.makeText(getApplicationContext(), "Gagal Mengambil Data Kuesioner !", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(@NonNull Call<ResponsModelQuestion> call, @NonNull Throwable t) {
            loading.dismiss();
            Log.e("onFailure : ","Message : "+String.valueOf(t.getMessage()));
            Toast.makeText(getApplicationContext(), "Gagal Menghubungkan Internet !", Toast.LENGTH_SHORT).show();
        }
    });
}

private void callQuestion2(String kd_pertanyaan){
    loading.setMessage("Loading ...");
    loading.setCancelable(false);
    loading.show();
    BaseApiService apiService = Server.getUrl().create(BaseApiService.class);
    Call<ResponsModelQuestion> getdata = apiService.getPertanyaan(kd_pertanyaan);
    getdata.enqueue(new Callback<ResponsModelQuestion>() {
        @Override
        public void onResponse(@NonNull Call<ResponsModelQuestion> call, @NonNull Response<ResponsModelQuestion> response) {
            if (response.isSuccessful()){
                loading.dismiss();
                Log.d("onResponse", "Message : " + Objects.requireNonNull(response.body()).getKode());
                List<Question> listPertanyaan = response.body().getResult();

                QuestionAdapter adapter = new QuestionAdapter(getApplicationContext(), titleB, listPertanyaan);
                adapter.setListQuestion(listPertanyaan);
                sectionAdapter.addSection(adapter);
                rvPertanyaan.setAdapter(sectionAdapter);
            }
            else {
                loading.dismiss();
                Toast.makeText(getApplicationContext(), "Gagal Mengambil Data Kuesioner !", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(@NonNull Call<ResponsModelQuestion> call, @NonNull Throwable t) {
            loading.dismiss();
            Log.e("onFailure : ","Message : "+String.valueOf(t.getMessage()));
            Toast.makeText(getApplicationContext(), "Gagal Menghubungkan Internet !", Toast.LENGTH_SHORT).show();
        }
    });
}

private void callQuestion3(String kd_pertanyaan){
    loading.setMessage("Loading ...");
    loading.setCancelable(false);
    loading.show();
    BaseApiService apiService = Server.getUrl().create(BaseApiService.class);
    Call<ResponsModelQuestion> getdata = apiService.getPertanyaan(kd_pertanyaan);
    getdata.enqueue(new Callback<ResponsModelQuestion>() {
        @Override
        public void onResponse(@NonNull Call<ResponsModelQuestion> call, @NonNull Response<ResponsModelQuestion> response) {
            if (response.isSuccessful()){
                loading.dismiss();
                Log.d("onResponse", "Message : " + Objects.requireNonNull(response.body()).getKode());
                List<Question> listPertanyaan = response.body().getResult();

                QuestionAdapter adapter = new QuestionAdapter(getApplicationContext(), titleC, listPertanyaan);
                adapter.setListQuestion(listPertanyaan);
                sectionAdapter.addSection(adapter);
                rvPertanyaan.setAdapter(sectionAdapter);
            }
            else {
                loading.dismiss();
                Toast.makeText(getApplicationContext(), "Gagal Mengambil Data Kuesioner !", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(@NonNull Call<ResponsModelQuestion> call, @NonNull Throwable t) {
            loading.dismiss();
            Log.e("onFailure : ","Message : "+String.valueOf(t.getMessage()));
            Toast.makeText(getApplicationContext(), "Gagal Menghubungkan Internet !", Toast.LENGTH_SHORT).show();
        }
    });
}

private void callQuestion4(String kd_pertanyaan){
    loading.setMessage("Loading ...");
    loading.setCancelable(false);
    loading.show();
    BaseApiService apiService = Server.getUrl().create(BaseApiService.class);
    Call<ResponsModelQuestion> getdata = apiService.getPertanyaan(kd_pertanyaan);
    getdata.enqueue(new Callback<ResponsModelQuestion>() {
        @Override
        public void onResponse(@NonNull Call<ResponsModelQuestion> call, @NonNull Response<ResponsModelQuestion> response) {
            if (response.isSuccessful()){
                loading.dismiss();
                Log.d("onResponse", "Message : " + Objects.requireNonNull(response.body()).getKode());
                List<Question> listPertanyaan = response.body().getResult();

                QuestionAdapter adapter = new QuestionAdapter(getApplicationContext(), titleD, listPertanyaan);
                adapter.setListQuestion(listPertanyaan);
                sectionAdapter.addSection(adapter);
                rvPertanyaan.setAdapter(sectionAdapter);
            }
            else {
                loading.dismiss();
                Toast.makeText(getApplicationContext(), "Gagal Mengambil Data Kuesioner !", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(@NonNull Call<ResponsModelQuestion> call, @NonNull Throwable t) {
            loading.dismiss();
            Log.e("onFailure : ","Message : "+String.valueOf(t.getMessage()));
            Toast.makeText(getApplicationContext(), "Gagal Menghubungkan Internet !", Toast.LENGTH_SHORT).show();
        }
    });
}

}

【问题讨论】:

  • 我相信错误与 QuestionAdapter 类有关,您在 RadioButton 的 setOnCheckedChangeListener 事件中设置 5 的位置。异常错误也说明了这一点。在异常中,您有索引 5 和大小 5。重要的是要记住索引从 0 开始,大小从 1 开始。因此,您设置的位置超出了数组列表的大小。
  • 你能给我一个解决方案吗?
  • 单选按钮的作用是什么?
  • 用于将值发送到数据库的单选按钮,但在此之前,我遇到了获取像这篇文章这样的数据的问题
  • 您能否尝试在 callQuestion 函数之前移动 setLayoutManager 和 setHasFixedSize(true),并在 onCreate 结束时删除 rvPertanyaan.setAdapter(sectionAdapter),因为您已经在 callQuestion 函数中执行此操作。跨度>

标签: java android android-recyclerview retrofit2 indexoutofboundsexception


【解决方案1】:

以下代码导致异常:

rvPertanyaan.setAdapter(sectionAdapter)

删除它应该可以解决问题,并且代码没有任何用途。原因是这个适配器设置在每个 callQuestion 函数的末尾,如果它获得成功的响应。除此之外,您还可以移动

rvPertanyaan.setLayoutManager(new LinearLayoutManager(this));

callQuestion1(); 函数上方,因为确保在设置适配器之前设置布局管理器很重要。

关于 IndexOutOfBoundsException,您必须注意的一点是索引和大小。列表的大小从 1 开始;而索引从 0 开始。当您尝试访问大于大小的索引时,将导致 IndexOutOfBoundsException。

【讨论】:

    猜你喜欢
    • 2015-06-16
    • 2014-09-11
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    相关资源
    最近更新 更多