Reputation: 35
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
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
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