Код адаптера:
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 и author.txt находятся в папке res моего проекта. Кроме того, приложение показывает первые несколько экземпляров getAuthors и getQuotes, но после их показа происходит сбой. Я не знаю, почему он падает. Может быть, если я добавлю исключение в свой код адаптера для обработки, когда больше нет элементов для просмотра. Но сбой происходит, когда авторы включаются в код адаптера. Я удалил список авторов из заполнения в recyclerview, и кавычки правильно отображались без сбоев, даже если отображать было нечего (кавычек больше не было).
Любая помощь, ребята?
Adapter
говорит, что в немquotes.size()
элементов, и у вас явно больше цитат, чем у авторов. Это риск, на который вы идете, когда используете несколько отдельных списков. - person Mike M.   schedule 10.04.2020Quote
, в котором есть поляString text;
иString author;
, и везде использовал одинList<Quote>
. - person Mike M.   schedule 10.04.2020