Mateus KP
Mateus KP

Reputation: 35

Error in my RecyclerViw adapter, populated with firebase data

I have an error in the adapter of my recyclerView, and I dont know what exactly is causing it.

The code of fragment where the recyclerView is:

public class materiaFragment extends Fragment {
private RecyclerView recyclerView;
private ArrayList<String> listaProf, listaDisc, listaNomeM, nomeSalas, passarSala ;
private DatabaseReference reference = FirebaseDatabase.getInstance().getReference("usuarios/");
private DatabaseReference referenceExec = FirebaseDatabase.getInstance().getReference("salas/");
private DatabaseReference referencePegarExec, referenceProf, referenceDisc, referenceProf2;
private adapterMateria adapterMateria;
private String nomeAluno, teste="", prof="", disc="";
private TextView txtDida;

public materiaFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_materia, container, false);
    recyclerView = view.findViewById(R.id.recyclerViewM);
    txtDida= view.findViewById(R.id.txtDida);
    final Context context = view.getContext();

    listaNomeM= new ArrayList<>();
    listaDisc= new ArrayList<>();
    listaProf= new ArrayList<>();
    nomeSalas= new ArrayList<>();
    passarSala= new ArrayList<>();

   pegarM();
    adapterMateria = new adapterMateria(listaProf, listaDisc, listaNomeM, context );
    //adapterSalas adapterMateria = new adapterSalas(listaNomeM, context);
    //configurar recycler view
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(context);
    recyclerView.setLayoutManager(layoutManager);
    //recyclerView.setHasFixedSize(true);
    recyclerView.addItemDecoration(new DividerItemDecoration(context, LinearLayout.VERTICAL));
    recyclerView.setAdapter(adapterMateria);

    //evento click
    recyclerView.addOnItemTouchListener(
            new RecyclerItemClickListener(context, recyclerView, new RecyclerItemClickListener.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {

                    // Toast.makeText(context, "Item selecionado: " + exercicio.getNomeAtv(),Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(getActivity(), verMateriaActivity.class);
                    intent.putExtra("nMateria", listaNomeM.get(position));
                    intent.putExtra("nSala", passarSala.get(position));
                    startActivity(intent);
                }

                @Override
                public void onLongItemClick(View view, int position) {

                    //  Toast.makeText(context, "Click longo: "  + exercicio.getNomeAtv(),Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(getActivity(), verMateriaActivity.class);
                    startActivity(intent);
                }

                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                }
            })
    );
    return view;}

    /*
@Override
public void onStart() {
    super.onStart();
    listaProf.clear();
    listaDisc.clear();
    listaNomeM.clear();
    nomeSalas.clear();
    passarSala.clear();

}*/



public void pegarM(){


    FirebaseAuth autenticacao = FirebaseAuth.getInstance();
    String emailUsu = autenticacao.getCurrentUser().getEmail();
    reference.orderByChild("email").equalTo(emailUsu).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot datas : dataSnapshot.getChildren()) {
                nomeAluno = datas.child("nome").getValue().toString();
                referenceExec.orderByChild("alunos/"+ nomeAluno+"/codigo").equalTo(nomeAluno).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        if(dataSnapshot.exists()) {
                            for (DataSnapshot datas : dataSnapshot.getChildren()) {
                                nomeSalas.add(datas.getKey());
                            }
                            for (int i = 0; i < nomeSalas.size(); i++) {

                                referencePegarExec = FirebaseDatabase.getInstance().getReference("salas/" + nomeSalas.get(i) + "/materia/");
                                referenceProf = FirebaseDatabase.getInstance().getReference("salas/" + nomeSalas.get(i) + "/nomeProf");


                                final int finalI = i; // o erro eu
                                referencePegarExec.addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                        for (DataSnapshot dsp : dataSnapshot.getChildren()) {
                                            if (!dsp.getKey().equals("1")) {
                                                listaNomeM.add(dsp.getKey());
                                                passarSala.add(nomeSalas.get(finalI));
                                                referenceProf.addListenerForSingleValueEvent(new ValueEventListener() {
                                                    @Override
                                                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                                        listaProf.add(dataSnapshot.getValue(String.class));
                                                        referenceDisc = FirebaseDatabase.getInstance().getReference("salas/" + nomeSalas.get(finalI) + "/disciplina");

                                                        referenceDisc.addListenerForSingleValueEvent(new ValueEventListener() {
                                                            @Override
                                                            public void onDataChange(@NonNull DataSnapshot dataa) {
                                                                listaDisc.add(dataa.getValue().toString());
                                                                adapterMateria.notifyDataSetChanged();
                                                                // txtNomeA.setText(dataa.getValue(String.class));

                                                            }

                                                            @Override
                                                            public void onCancelled(@NonNull DatabaseError databaseError) {

                                                            }
                                                        });
                                                    }

                                                    @Override
                                                    public void onCancelled(@NonNull DatabaseError databaseError) {

                                                    }
                                                });

                                            }

                                        }

                                    }

                                    @Override
                                    public void onCancelled(@NonNull DatabaseError databaseError) {

                                    }
                                });
                            }
                        }else {
                            txtDida.setText("Nenhum arquivo didático disponível");
                        }


                    }



                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {
                        throw databaseError.toException();
                    }
                });

            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException();
        }
    });
}

}

Adapter:

public class adapterMateria extends RecyclerView.Adapter<adapterMateria.myViewHolder> {
private ArrayList<String> listaProf, listaDisc, listaNomeM ;
private Context context;

public adapterMateria(ArrayList<String> listaProf, ArrayList<String> listaDisc, ArrayList<String> listaNomeM, Context context) {
    this.listaProf = listaProf;
    this.listaDisc = listaDisc;
    this.listaNomeM = listaNomeM;
    this.context = context;
}

@NonNull
@Override
public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
    View itemLista = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.adaptermateria_lista, parent, false);

    return new myViewHolder(itemLista);
}

@Override
public void onBindViewHolder(@NonNull myViewHolder holder, int position) {
    holder.nomeMateria.setText(listaNomeM.get(position));
    holder.materiaM.setText(listaDisc.get(position)); //error
    holder.professor.setText(listaProf.get(position));
}

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

public class myViewHolder extends RecyclerView.ViewHolder{
    TextView nomeMateria, materiaM, professor;

    public myViewHolder(@NonNull View itemView) {
        super(itemView);

        nomeMateria= itemView.findViewById(R.id.textNomeConteudo);
        materiaM= itemView.findViewById(R.id.textMateriaM);
        professor= itemView.findViewById(R.id.textProfessor);

    }
}

}

logcat error massage:

2019-11-11 20:12:32.705 27650-27650/com.example.classmob E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.classmob, PID: 27650
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
    at java.util.ArrayList.get(ArrayList.java:437)
    at com.example.classmob.adapter.adapterMateria.onBindViewHolder(adapterMateria.java:40)
    at com.example.classmob.adapter.adapterMateria.onBindViewHolder(adapterMateria.java:17)
    at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
    at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)
    at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752)
    at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641)
    at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4194)
    at android.view.View.layout(View.java:20680)
    at android.view.ViewGroup.layout(ViewGroup.java:6197)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
    at android.view.View.layout(View.java:20680)
    at android.view.ViewGroup.layout(ViewGroup.java:6197)
    at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1775)
    at android.view.View.layout(View.java:20680)
    at android.view.ViewGroup.layout(ViewGroup.java:6197)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
    at android.view.View.layout(View.java:20680)
    at android.view.ViewGroup.layout(ViewGroup.java:6197)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:20680)
    at android.view.ViewGroup.layout(ViewGroup.java:6197)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
    at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1801)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1567)
    at android.view.View.layout(View.java:20680)
    at android.view.ViewGroup.layout(ViewGroup.java:6197)
    at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:142)
    at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:41)
    at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1556)
    at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:888)
    at android.view.View.layout(View.java:20680)
    at android.view.ViewGroup.layout(ViewGroup.java:6197)
    at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1231)
    at android.view.View.layout(View.java:20680)
    at android.view.ViewGroup.layout(ViewGroup.java:6197)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:20680)
    at android.view.ViewGroup.layout(ViewGroup.java:6197)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
`2019-11-11 20:12:32.707 27650-27650/com.example.classmob E/AndroidRuntime:     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
    at android.view.View.layout(View.java:20680)
    at android.view.ViewGroup.layout(ViewGroup.java:6197)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at android.view.View.layout(View.java:20680)
    at android.view.ViewGroup.layout(ViewGroup.java:6197)
    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
    at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
    at android.view.View.layout(View.java:20680)
    at android.view.ViewGroup.layout(ViewGroup.java:6197)
    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
    at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
    at com.android.internal.policy.DecorView.onLayout(DecorView.java:792)
    at android.view.View.layout(View.java:20680)
    at android.view.ViewGroup.layout(ViewGroup.java:6197)
    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2831)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2358)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1494)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7288)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
    at android.view.Choreographer.doCallbacks(Choreographer.java:761)
    at android.view.Choreographer.doFrame(Choreographer.java:696)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6923)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:870)

I know that what is causing the bug is in this line of the adapter: " holder.materiaM.setText(listaDisc.get(position));". But the arrayList, listaDisc, is getting the data normally from the fragment, so i dont know what could be causing this error. Can someone help?

Upvotes: 0

Views: 52

Answers (2)

GHH
GHH

Reputation: 2019

You should have only one list in your adapter because over two lists in your adapter, onBindViewHolder and getItemCount will very easily get error

You can deal with those data in Fragment and set the list to adapter and call notifyDataSetChanged to notify adapter to show data.

Hope this help

Upvotes: 0

Eren T&#252;fek&#231;i
Eren T&#252;fek&#231;i

Reputation: 2511

The error is because of the list sizes changing getItemCount() can help

    @Override
        public int getItemCount() {
    int listSize;

    listSize = listaProf.size()

    if(listSize < listaNomeM.size())
    listSize = listaNomeM.size()

    if(listSize < listaDisc .size())
       listSize = listaDisc.size()

            return listSize;
        }

or if you dont want to lost your items (but data)

    @Override
    public void onBindViewHolder(@NonNull myViewHolder holder, int position) {
        holder.nomeMateria.setText(listaNomeM.get(position));

if(position < listaDisc.size() )
        holder.materiaM.setText(listaDisc.get(position));

if(position < listaProf.size() )
        holder.professor.setText(listaProf.get(position));
    }

the last thing, check your method to populate listaDisc

Upvotes: 1

Related Questions