I have a problem filling the recyclerview
through firebase
, I have 3 adapters, two horizontal adapters (one filled with firebase
and another directly from the code android studio), and an adapter that orders the two adapters mentioned in the fragment
. The problem lies when trying to call the downloaded data from firebase
(the downloaded data if stored in the function getHorizontal1Data
), in the function getObject()
. Which generates this error
Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
I attach the code, I hope you can help me. Greetings
CODE OF HOMEFRAGMENT
public class HomeFragment extends Fragment {
private RecyclerView recyclerView;
private RecyclerView.LayoutManager layoutManager;
private HomeAdapter adapter;
private ArrayList<Object> objects = new ArrayList<>();
//private DatabaseReference base1;
//private List<SingleHorizontal1> data1;
private static ArrayList data1 = new ArrayList<SingleHorizontal1>();
//private static List<List<String>> data2;
public HomeFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
// getData1();
Log.d("jaja", "Tamano de data1 segundo check" + " / " + data1.size());
recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
adapter = new HomeAdapter(getContext(), getObject());
recyclerView.setAdapter(adapter);
return view;
}
private ArrayList<Object> getObject() {
objects.clear();
if (getHorizontal1Data().size() != 0) {
objects.add(getHorizontal1Data().get(0));
} else {
objects.add(getHorizontal1Data().get(0));
objects.add(getHorizontal2Data().get(0));
Log.d("jaja", ""+ getHorizontal1Data().size());
}
//objects.add(getHorizontal1Data().get(0));
//objects.add(getHorizontal2Data().get(0));
return objects;
}
private ArrayList<Object> getObjectOtro() {
objects.clear();
//objects.add(getHorizontal1Data().get(0));
objects.add(getHorizontal2Data().get(0));
return objects;
}
/*
public static ArrayList<SingleHorizontal1> getHorizontal1Data() {
ArrayList<SingleHorizontal1> singleHorizontals1 = new ArrayList<>();
singleHorizontals1.add(new SingleHorizontal1("Chifa", Integer.toString(R.drawable.chifa)));
singleHorizontals1.add(new SingleHorizontal1("Pollo", Integer.toString(R.drawable.pollo)));
singleHorizontals1.add(new SingleHorizontal1("Chaufa", Integer.toString(R.drawable.chifa)));
return singleHorizontals1;
}
*/
public static ArrayList<SingleHorizontal2> getHorizontal2Data() {
ArrayList<SingleHorizontal2> singleHorizontals2 = new ArrayList<>();
singleHorizontals2.add(new SingleHorizontal2("Chifa", R.drawable.chifa));
singleHorizontals2.add(new SingleHorizontal2("Pollo", R.drawable.pollo));
singleHorizontals2.add(new SingleHorizontal2("Chaufa", R.drawable.chifa));
return singleHorizontals2;
}
public static ArrayList<SingleHorizontal1> getHorizontal1Data() {
data1 = new ArrayList<>();
//data2 = new ArrayList<>();
FirebaseDatabase database = FirebaseDatabase.getInstance();
database.getReference("Negocios").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//data1.removeAll(data1);
// data2.removeAll(data2);
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
//data2.removeAll(data2);
String name = snapshot.child("name").getValue(String.class);
String imgBackground = snapshot.child("imgBackground").getValue(String.class);
//double timestamp = ds.child("timestamp").getValue(Double.class);
Log.d("TAG", name + " / " + imgBackground);
data1.add(new SingleHorizontal1(name, imgBackground));
//data1.add(0, new SingleHorizontal1(name, imgBackground));
Log.d("TAG", "Tamano de data1" + " / " + data1.size());
//objects.add(data1);
//SingleHorizontal1 data2 = new SingleHorizontal1(name, imgBackground);
//data1.add(data2);
//objects.add(data2);
}
//objects.add(data1.get(0));
Log.d("TAG", "Data1" + " / " + data1.get(0));
//Log.d("TAG", "objects" + " / " + objects);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return data1;
}
}
CODE OF THE ADAPTER OF THE TWO ADAPTERS IN THE FRAGMENT
package com.example.kevin.deliapp.activities.adapterHome;
import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.content.Intent;
import android.util.Log;
import com.example.kevin.deliapp.R;
import com.example.kevin.deliapp.activities.activitiesHome.InformationActivity;
import com.example.kevin.deliapp.activities.modelHome.SingleHorizontal1;
import com.example.kevin.deliapp.activities.modelHome.SingleHorizontal2;
import java.util.ArrayList;
import static com.example.kevin.deliapp.activities.fragments.HomeFragment.getHorizontal1Data;
import static com.example.kevin.deliapp.activities.fragments.HomeFragment.getHorizontal2Data;
public class HomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private ArrayList<Object> items;
private final int HORIZONTAL1 = 1;
private final int HORIZONTAL2 = 2;
private OnItemClickListener listener;
public HomeAdapter(Context context, ArrayList<Object> items) {
this.context = context;
this.items = items;
}
public HomeAdapter(Context context, ArrayList<Object> items, OnItemClickListener listener) {
this.context = context;
this.items = items;
this.listener = listener;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view;
RecyclerView.ViewHolder holder;
switch (viewType) {
case HORIZONTAL1:
view = inflater.inflate(R.layout.horizontal1, parent, false);
holder = new Horizontal1ViewHolder(view);
break;
case HORIZONTAL2:
view = inflater.inflate(R.layout.horizontal2, parent, false);
holder = new Horizontal2ViewHolder(view);
break;
default:
view = inflater.inflate(R.layout.horizontal1, parent, false);
holder = new Horizontal1ViewHolder(view);
break;
}
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder.getItemViewType() == HORIZONTAL1)
horizontal1View((Horizontal1ViewHolder) holder);
else if (holder.getItemViewType() == HORIZONTAL2)
horizontal2View((Horizontal2ViewHolder) holder);
}
private void horizontal1View(Horizontal1ViewHolder holder) {
//ESTO ES PARA CUANDO AGREGUE LA OPCION DE TOCAR EL CARDVIEW Y ABRIR OTRA VENTANA
HorizontalAdapter1 adapter1 = new HorizontalAdapter1(getHorizontal1Data(), R.layout.horizontal1_single_row, context, new HorizontalAdapter1.OnItemClickListener() {
@Override
public void onItemClick(SingleHorizontal1 data, int position) {
//Falta agregar accion
java.lang.String v = "hola";
Log.d("hola", ""+ v);
//adapter1.notifyItemChanged(position);
Intent intent = new Intent(context, InformationActivity.class);
//intent.putExtra("id", girl.getId());
intent.putExtra("img1", data.getImgBackground());
intent.putExtra("name", data.getName());
context.startActivity(intent);
}
});
/*
HorizontalAdapter1 adapter1 = new HorizontalAdapter1(getHorizontal1Data(), new HorizontalAdapter1.OnItemClickListener() {
@java.lang.Override
public void onItemClick(SingleHorizontal1 data, int position) {
java.lang.String v = "hola";
Log.d("hola", ""+ v);
//adapter.notifyItemChanged(position);
Intent intent = new Intent(context, InformationActivity.class);
//intent.putExtra("id", girl.getId());
intent.putExtra("img1", data.getImgBackground());
context.startActivity(intent);
// startActivity(intent);
}
});
*/
holder.recyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
holder.recyclerView.setAdapter(adapter1);
}
private void horizontal2View(Horizontal2ViewHolder holder) {
HorizontalAdapter2 adapter = new HorizontalAdapter2(getHorizontal2Data());
holder.recyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
holder.recyclerView.setAdapter(adapter);
}
@Override
public int getItemCount() {
return items.size();
}
@Override
public int getItemViewType(int position) {
if (items.get(position) instanceof SingleHorizontal1)
return HORIZONTAL1;
if (items.get(position) instanceof SingleHorizontal2)
return HORIZONTAL2;
return -1;
}
public class Horizontal1ViewHolder extends RecyclerView.ViewHolder {
RecyclerView recyclerView;
Horizontal1ViewHolder(View itemView) {
super(itemView);
recyclerView = (RecyclerView) itemView.findViewById(R.id.inner_recyclerView);
}
}
public class Horizontal2ViewHolder extends RecyclerView.ViewHolder {
RecyclerView recyclerView;
Horizontal2ViewHolder(View itemView) {
super(itemView);
recyclerView = (RecyclerView) itemView.findViewById(R.id.inner_recyclerView);
}
}
public interface OnItemClickListener {
void onItemClick(SingleHorizontal1 data, int position);
}
}
FIRST ADAPTER
public class HorizontalAdapter1 extends RecyclerView.Adapter<HorizontalAdapter1.ViewHolder> {
private List<SingleHorizontal1> data;
private int layout;
private Context context;
private OnItemClickListener listener;
private OnItemClickListener listenerFavorite;
private OnButtonClickListener btnClickListener;
public HorizontalAdapter1(List<SingleHorizontal1> data, int layout, Context context, OnItemClickListener listener, OnButtonClickListener btnListener) {
this.data = data;
this.layout = layout;
this.context = context;
this.listener = listener;
this.btnClickListener = btnListener;
}
public HorizontalAdapter1(List<SingleHorizontal1> data, int layout, Context context, OnItemClickListener listener) {
this.data = data;
this.layout = layout;
this.context = context;
this.listener = listener;
}
public HorizontalAdapter1(List<SingleHorizontal1> data) {
this.data = data;
}
public HorizontalAdapter1(List<SingleHorizontal1> data, OnItemClickListener listener) {
this.data = data;
this.listener = listener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.horizontal1_single_row, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.bind(data.get(position), listener, btnClickListener);
}
@Override
public int getItemCount() {
return data.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView textViewName;
public ImageView imageViewBackground;
public ViewHolder(View itemView) {
super(itemView);
textViewName = (TextView) itemView.findViewById(R.id.textViewName);
imageViewBackground = (ImageView) itemView.findViewById(R.id.imageViewBackground);
}
public void bind(final SingleHorizontal1 data, final OnItemClickListener listener, final OnButtonClickListener btnListener) {
this.textViewName.setText(data.getName());
// Cargamos la imagen con Picasso
Picasso.with(context).load(Integer.parseInt(data.getImgBackground())).fit().into(this.imageViewBackground);
//this.imageViewBackground.setImageResource(Integer.parseInt(data.getImgBackground()));
//Picasso.with(context).load(data.getImgBackground()).fit().into(this.imageViewBackground);
// Añadimos el listener click para cada elemento fruta
this.imageViewBackground.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onItemClick(data, getAdapterPosition());
}
});
}
}
public interface OnItemClickListener {
void onItemClick(SingleHorizontal1 data, int position);
}
public interface OnButtonClickListener {
void onButtonClick(SingleHorizontal1 data, int position);
}
public void setFilter(ArrayList<SingleHorizontal1> data) {
this.data = new ArrayList<>();
this.data.addAll(data);
notifyDataSetChanged();
}
}
SECOND ADAPTER
public class HorizontalAdapter2 extends RecyclerView.Adapter<HorizontalAdapter2.ViewHolder> {
private List<SingleHorizontal2> data;
private int layout;
private Context context;
private OnItemClickListener listener;
private OnItemClickListener listenerFavorite;
private OnButtonClickListener btnClickListener;
public HorizontalAdapter2(List<SingleHorizontal2> data, int layout, Context context, OnItemClickListener listener, OnButtonClickListener btnListener) {
this.data = data;
this.layout = layout;
this.context = context;
this.listener = listener;
this.btnClickListener = btnListener;
}
public HorizontalAdapter2(List<SingleHorizontal2> data) {
this.data = data;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.horizontal2_single_row, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.bind(data.get(position), listener, btnClickListener);
}
@Override
public int getItemCount() {
return data.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView textViewName;
public ImageView imageViewBackground;
public ViewHolder(View itemView) {
super(itemView);
textViewName = (TextView) itemView.findViewById(R.id.textViewName);
imageViewBackground = (ImageView) itemView.findViewById(R.id.imageViewBackground);
}
public void bind(final SingleHorizontal2 data, final OnItemClickListener listener, final OnButtonClickListener btnListener) {
this.textViewName.setText(data.getName());
// Cargamos la imagen con Picasso
//Picasso.with(context).load(data.getImgBackground()).fit().into(this.imageViewBackground);
this.imageViewBackground.setImageResource(data.getImgBackground());
// Añadimos el listener click para cada elemento fruta
this.imageViewBackground.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.onItemClick(data, getAdapterPosition());
}
});
}
}
public interface OnItemClickListener {
void onItemClick(SingleHorizontal2 data, int position);
}
public interface OnButtonClickListener {
void onButtonClick(SingleHorizontal2 data, int position);
}
public void setFilter(ArrayList<SingleHorizontal2> data) {
this.data = new ArrayList<>();
this.data.addAll(data);
notifyDataSetChanged();
}
}
CLASS MODEL OF THE ADAPTERS, COUNT ON THE SAME DATA
public class SingleHorizontal1 {
//@Required
private String name;
//@Required
private String imgBackground;
public SingleHorizontal1() {
}
public SingleHorizontal1(String name, String imgBackground) {
this.name = name;
this.imgBackground = imgBackground;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImgBackground() {
return imgBackground;
}
public void setImgBackground(String imgBackground) {
this.imgBackground = imgBackground;
}
}