У меня есть RecyclerView, который заполнен 2 видами элементов списка: Книги и Рецепт .Чтобы это работало, я создал абстрактную подставку для просмотра и 2 держателя представления для книг и рецептов каждый и связал их вместе.Работает отлично.То, с чем я застрял, это то, что я хочу установить прослушиватель щелчков на элементах представления переработчика и получить некоторые данные в соответствии с этим в другом представлении.Предположим, что в моем представлении переработчика содержится 5 элементов (3 книги и 2 рецепта). Я успешно реализовал прослушиватель кликов для элементов книги, и результат отображается, как и ожидалось.Тем не менее, для рецептов было получено сообщение об ошибке java.lang.IndexOutOfBoundsException: Index: 3, Size: 1
в строке ABC (отмечено в моем коде внутри класса SearchResultActivity), если только я не получу размер держателя предварительного просмотра и минус от позиции, чтобы сбросить позицию до 0. Однако я не думаю, чтоэто правильный способ сделать это, так как это увеличит избыточный код, если я скажу 5 различных держателей просмотра.
Вопрос: Как мне правильно настроить прослушиватель здесь?
SearhResultActivity (показывает представление рециркулятора с данными)
public class SearchResultActivity extends HomeActivity {
private static final String TAG = "SearchResultActivity";
private static final String TAG = "SearchResultActivity";
protected FrameLayout frames;
@BindView(R.id.search_result_recycler)
RecyclerView recyclerView;
private SearchRecyclerAdapter searchRecyclerAdapter;
private FragmentManager mFragmentManager;
private RecyclerView.LayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_result);
ButterKnife.bind(this);
frames = findViewById(R.id.search_bar_holder);
mFragmentManager = (this).getSupportFragmentManager();
mFragmentManager.beginTransaction().add(R.id.search_bar_holder, new SearchTabFragment()).commit();
recyclerFunctions();
}
public void recyclerFunctions() {
recyclerView.setHasFixedSize(true);
// use a linear layout manager
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
ArrayList<Book> getBookArrayList = new ArrayList<>();
getBookArrayList = (ArrayList<Book>) getIntent().getSerializableExtra("bookList");
ArrayList<Recipe> getRecipeArrayList = new ArrayList<>();
getRecipeArrayList = (ArrayList<Recipe>) getIntent().getSerializableExtra("recipeList");
searchRecyclerAdapter = new SearchRecyclerAdapter(this);
recyclerView.setAdapter(searchRecyclerAdapter);
//searchRecyclerAdapter.add(foodData);
searchRecyclerAdapter.add(getBookArrayList);
searchRecyclerAdapter.add(getRecipeArrayList);
final ArrayList<Book> finalGetBookArrayList = getBookArrayList;
final ArrayList<Recipe> finalGetRecipeArrayList = getRecipeArrayList;
searchRecyclerAdapter.setOnItemClickListener(new SearchRecyclerAdapter.OnItemClickListener() {
@Override
public void onItemClick(int i) {
int itemType = searchRecyclerAdapter.getItemViewType(i);
Log.d(TAG, "onItemClick: " + searchRecyclerAdapter.getItemCount()+""+searchRecyclerAdapter.getItemId(i));
if (itemType == TYPE_BOOK){
Intent intent = new Intent(SearchResultActivity.this, DetailsActivity.class);
Bundle bundle=new Bundle();
bundle.putSerializable("bookData", finalGetBookArrayList.get(i));
intent.putExtras(bundle);
startActivity(intent);
} else if (itemType == TYPE_RECIPE){
int size = finalGetBookArrayList.size();
/*LINE ABC*/
Intent intent = new Intent(SearchResultActivity.this, DetailsActivity.class);
Bundle bundle=new Bundle();
bundle.putSerializable("recipeData", finalGetRecipeArrayList.get(i - size));
intent.putExtras(bundle);
startActivity(intent);
}
}
});
}
}
SearchRecyclerAdapter (этот адаптер содержит коды для объявления и подключения всех viewHolders к абстрактному viewHolder с подключением к представлению рециркулятора и интерфейсу OnItemClickListener)
package com.example.naisse.AdapterAndClass;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.naisse.Api.Model.Search.Food;
import com.example.naisse.Api.Model.Search.Quran;
import com.example.naisse.R;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
public class SearchRecyclerAdapter extends RecyclerView.Adapter<SearchRecyclerAdapter.AbstractViewHolder>{
private static final String TAG = "SearchRecyclerAdapter";
public static final int TYPE_FOOD = 0;
public static final int TYPE_BOOK = 1;
private Context context;
private List<Object> data;
private OnItemClickListener mListener;
public void setOnItemClickListener(OnItemClickListener listener) {
mListener = listener;
}
public interface OnItemClickListener {
void onItemClick(int i);
}
/*I belive im missing something here*/
public SearchRecyclerAdapter(Context context){
this.context = context;
}
public void add(ArrayList newData){
if(data == null){
data = new ArrayList<>();
}
data.addAll(newData);
notifyDataSetChanged();
}
@Override
public AbstractViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
switch (i){
case TYPE_BOOK:{
/*search_result_fragment is the xml layout for food adapter*/
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.viewholder_book, viewGroup, false);
return new BookViewAdapter(view, mListener);
}
case TYPE_RECIPE:{
/*search_result_fragment is the xml layout for book adapter*/
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.viewholder_recipe, viewGroup, false);
return new RecipeViewAdapter(view, mListener);
}
default:
throw new IllegalArgumentException("Invalid view type");
}
}
@Override
public void onBindViewHolder(AbstractViewHolder abstractViewHolder, int i) {
Object object = data.get(i);
if (abstractViewHolder instanceof BookViewAdapter) {
abstractViewHolder.bind(object);
} else if (abstractViewHolder instanceof RecipeViewAdapter) {
abstractViewHolder.bind(object);
} else {
throw new IllegalArgumentException("Invalid position");
}
}
@Override
public int getItemViewType(int i){
Object object = data.get(i);
if (object instanceof Book){
return TYPE_BOOK;
}else if (object instanceof Recipe){
return TYPE_RECIPE;
}
throw new IllegalArgumentException("Invalid position");
}
@Override
public int getItemCount() {
return data == null ? 0 : data.size();
}
public abstract class AbstractViewHolder<T> extends RecyclerView.ViewHolder{
public AbstractViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
public abstract void bind(T type);
}
public class BookViewAdapter extends AbstractViewHolder<Book> {
@BindView(R.id.result_book_title)
TextView bookTitle;
@BindView(R.id.result_book_content)
TextView content;
private BookViewAdapter(View itemView, final OnItemClickListener listener){
super(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
listener.onItemClick(position);
}
}
}
});
}
@Override
public void bind(Book type) {
bookTitle.setText("Book");
content.setText("title");
}
}
public class RecipeViewAdapter extends AbstractViewHolder<Recipe> {
@BindView(R.id.result_recipe_title)
TextView recipesTitle;
@BindView(R.id.result_recipe_content)
TextView content;
private RecipeViewAdapter(View itemView, final OnItemClickListener listener){
super(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
listener.onItemClick(position);
}
}
}
});
}
@Override
public void bind(Recipe type) {
recipesTitle.setText("title");
content.setText("Text");
}
}
}
Как мне решить эту проблему?