java.lang.IndexOutOfBoundsException:索引:7,大小:7。为什么会发生这种情况?

问题描述 投票:0回答:1

适配器代码:

import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.List;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class quotesAdapter extends RecyclerView.Adapter<quotesAdapter.quotesViewHolder> {

    private List<String> quotes;
    private List<String> authors;
    private List<ImageView> images = null;
    private Context context;

    public quotesAdapter(List<String> quotes, QuotesActivity quotesActivity, List<String> authors, Context context) {
        this.quotes = quotes;
        this.authors = authors;
        this.context = context;
    }


    @NonNull
    @Override
    public quotesViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.example_item_quotes, viewGroup, false);

//        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.example_item_quotes, parent, false);
//        RecyclerView.ViewHolder holder = new RecyclerView.ViewHolder(view) {

        return new quotesViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull quotesViewHolder holder, int i) {
        String[] colors = {"#952222", "#10171B", "#FF373535", "#ECE3D3", "#10171B","#10171B","#10171B","#10171B","#10171B","#10171B","#10171B","#10171B","#10171B"};
        String quote = quotes.get(i);
        ***String author = authors.get(i);***
        holder.txtQuote.setText(quote);
        holder.txtAuthor.setText(author);
        int color = i % colors.length;
        int intColor = Color.parseColor(colors[color]);
        holder.quoteContainer.setBackgroundColor(intColor);
        holder.txtQuote.setBackgroundColor(intColor);
        holder.txtAuthor.setBackgroundColor(intColor);

    }

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

    public static class quotesViewHolder extends RecyclerView.ViewHolder {

        TextView txtQuote;
        TextView txtAuthor;
        LinearLayout quoteContainer;

        public quotesViewHolder(@NonNull View itemView) {
            super(itemView);
            txtQuote = itemView.findViewById(R.id.txtQuote);
            txtAuthor = itemView.findViewById(R.id.txtAuthor);
            quoteContainer = itemView.findViewById(R.id.quotesContainer);
        }
    }
}

活动代码:

import android.media.Image;
import android.os.Bundle;
import android.widget.ImageView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

public class QuotesActivity extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.quotes_act);
        RecyclerView quotesList = findViewById(R.id.quotesList);
        quotesList.setLayoutManager(new LinearLayoutManager(this));
        quotesList.setAdapter(new quotesAdapter(getQuotes(), this,getAuthors(),this));
    }

    private List<String> getQuotes() {
        List<String> quotes = new ArrayList<>();
        BufferedReader bufferedReader = null;

        try {
            bufferedReader = new BufferedReader(new InputStreamReader(this.getAssets().open("quotes.txt"), "UTF-8"));
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                quotes.add(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return quotes;
    }

    private List<String> getAuthors() {
        List<String> authors = new ArrayList<>();
        BufferedReader bufferedReader = null;

        try {
            bufferedReader = new BufferedReader(new InputStreamReader(this.getAssets().open("authors.txt"), "UTF-8"));
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                authors.add(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return authors;
    }

}

错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: konak.labs.warstoriesv2, PID: 820
    java.lang.IndexOutOfBoundsException: Index: 7, Size: 7
        at java.util.ArrayList.get(ArrayList.java:437)
        at konak.labs.warstoriesv2.quotesAdapter.onBindViewHolder(quotesAdapter.java:47)
        at konak.labs.warstoriesv2.quotesAdapter.onBindViewHolder(quotesAdapter.java:17)
        at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
        at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019)
        at androidx.recyclerview.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:286)
        at androidx.recyclerview.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:343)
        at androidx.recyclerview.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:359)
        at androidx.recyclerview.widget.GapWorker.prefetch(GapWorker.java:366)
        at androidx.recyclerview.widget.GapWorker.run(GapWorker.java:397)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

quotes.txt和authors.txt位于我项目的res文件夹内。此外,该应用程序确实显示了getAuthors和getQuotes的前几个实例,但是在显示这些实例后会崩溃。我不知道为什么会崩溃。也许如果我在适配器代码中抛出异常以处理没有更多要查看的项目时。但是当适配器代码中包含作者时,会发生崩溃。我从recyclerview中删除了作者列表,即使没有内容可显示,引号也可以正确显示而不会崩溃(没有更多引号)。

有帮助吗?

java android android-recyclerview android-adapter indexoutofboundsexception
1个回答
0
投票

索引从0开始。因此,对于大小为7的数组,索引将从0到6。

  • 如果索引为0,则它引用数组的第一元素
  • 如果索引为1,则引用第二元素
  • ...

错误

java.lang.IndexOutOfBoundsException: Index: 7, Size: 7

表示]

该数组只有7个元素,但是尝试提取第8个元素。

© www.soinside.com 2019 - 2024. All rights reserved.