0

Ich versuche, einen RecyclerView mit Informationen aus meiner Firebase-Datenbank zu erhalten.Anzeigen mehrerer Elemente aus einem Firebase-Datenbankelement in RecyclerView

Ich hatte es mit nur 1 Element in der Datenbank arbeiten (ein int), aber jetzt habe ich auch einen String hinzugefügt und es wird nicht mehr funktionieren.

Meine Datenbankstruktur ist

-random key id 
    - item: "Coffee" 
    - points: 10 

Hier ist mein Adapter

public class RecyclerViewAdapter extends 
    RecyclerView.Adapter<RecyclerViewHolders> { 
    private List<Points> task; 
    protected Context context; 
    public RecyclerViewAdapter(Context context, List<Points> task) { 
     this.task = task; 
     this.context = context; 
    } 
    @Override 
    public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int 
    viewType) { 
     RecyclerViewHolders viewHolder = null; 
     View layoutView = 
    LayoutInflater.from(parent.getContext()).inflate(R.layout.to_do_list, 
    parent, false); 
     viewHolder = new RecyclerViewHolders(layoutView, task); 
     return viewHolder; 
    } 
    @Override 
    public void onBindViewHolder(RecyclerViewHolders holder, int position) 
    { 
     holder.categoryTitle.setText((task.get(position).getPoints())); 
     holder.itemTitle.setText(task.get(position).getItem()); 
    } 
    @Override 
    public int getItemCount() { 
     return this.task.size(); 
    } 
} 

Hier ist meine ViewHolder

public class RecyclerViewHolders extends RecyclerView.ViewHolder { 
    private static final String TAG = 
    RecyclerViewHolders.class.getSimpleName(); 
    public ImageView markIcon; 
    public TextView categoryTitle, itemTitle; 
    public ImageView deleteIcon; 
    private List<Points> taskObject; 

    public RecyclerViewHolders(final View itemView, final List<Points> taskObject) { 
     super(itemView); 
     this.taskObject = taskObject; 
     categoryTitle = (TextView) itemView.findViewById(R.id.task_title); 
     itemTitle = (TextView) itemView.findViewById(R.id.itemTV); 
    } 
} 

Und mein Code in meinem Haupt-Aktivität zu zeigen, zur Liste

allPoints = new ArrayList<Points>(); 
      recyclerView = (RecyclerView) 
    view.findViewById(R.id.point_list); 
      linearLayoutManager = new LinearLayoutManager(getActivity()); 
      recyclerView.setLayoutManager(linearLayoutManager); 

    private void getAllTask (DataSnapshot dataSnapshot) { 
     for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) { 
      String taskTitle = singleSnapshot.getValue(String.class); 
      String taskItem = singleSnapshot.getValue(String.class); 
      allPoints.add(new Points(taskItem, 
    Integer.parseInt(taskTitle))); 
      recyclerViewAdapter = new RecyclerViewAdapter(getActivity(), 
    allPoints); 
      recyclerView.setAdapter(recyclerViewAdapter); 
     } 
    } 

Es funktionierte, als ich nur die "Punkte" angezeigt hatte, aber jetzt, da ich den String 'item' hinzugefügt habe, wird ein NumberFormatExexton auf diese Zeichenfolge geworfen.

java.lang.NumberFormatException: Für die Eingabe-Stichwort: "Coffee"

Hier meine Modellklasse ist auch

public class Points { 

    public int points; 
    public String item; 

    public Points(){} 

    public Points(String item, int points) { 
     this.points = points; 
     this.item = item; 
    } 

    public int getPoints(){ 
     return points; 
    } 

    public void setPoints(int points){ 
     this.points = points; 
    } 

    public String getItem(){ 
     return item; 
    } 

    public void setItem(String item){ 
     this.item = item; 
    } 

} 

meine Struktur Hier ist

beans-card 
user 
urx53ou8uBhRODfyqqf57kb8Z0S2 
-KlYnqRvumMfu5h0FvLp 
item: 
    "Coffee" 
points: 
    10 

und meine Referenz

Verwenden
DatabaseReference db_receipt = 
FirebaseDatabase.getInstance().getReference().child("user").child(mUserId); 
+0

'Für Eingabestring:„Kaffee“' ... Dann speichern Sie nicht: 'Coffee' an dieser Variablen –

+0

Also, denken Sie, dass„Coffee“eine gültige Zahl ist? –

Antwort

2

1.) Points Klasse statt String

2.) Sie neu nicht Adapter in jeder Iteration der Schleife

for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) { 
     Points point = singleSnapshot.getValue(Points.class); 
     allPoints.add(point); 
    } 

// move adapter statements outside loop 
recyclerViewAdapter = new RecyclerViewAdapter(getActivity(),allPoints); 
recyclerView.setAdapter(recyclerViewAdapter); 
+0

Danke für die Hilfe, ich habe nicht einmal mein Duplikat bemerkt. aber jetzt bekomme ich einen neuen Fehler mit dieser Änderung. "com.google.firebase.database.DatabaseException: Objekt vom Typ java.lang.String kann nicht in den Typ com.jenovaprojects.beanscard.updated_ui.database konvertiert werden.Punkte " –

+0

poste deine Datenbankstruktur an root und code, wo du die Firebase' reference' erstellst –

+0

hinzugefügt beide zur Frage –

0

Sie verwenden diese zweimal singleSnapshot.getValue(String.class);, und so erhalten Sie die gleichen Daten zweimal.

Sie können Ihre Objekte direkt zuordnen.

Points point = singleSnapshot.getValue(Points.class); 

Dann erstellen Sie unnötigerweise einen neuen Adapter in jeder Schleife. Du brauchst das nur einmal.

recyclerView.setLayoutManager(linearLayoutManager); 

// Move this under above line 
recyclerViewAdapter = new RecyclerViewAdapter(getActivity(), allPoints); 
recyclerView.setAdapter(recyclerViewAdapter); 

Und Sie möchten wahrscheinlich die Liste vor der Schleife löschen.

private void getAllTask (DataSnapshot dataSnapshot) { 
    allPoints.clear(); // Remove the old data 
    for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) { 
     allpoints.add(singleSnapshot.getValue(Points.class)); 
    } 

    // Then, you notify the adapter, not create a new one 
    recyclerViewAdapter.notifyDataSetChanged(); 
} 
+0

Vielen Dank für die Hilfe, ich habe nicht einmal mein Duplikat bemerkt. Aber jetzt bekomme ich einen neuen Fehler mit dieser Änderung." com.google .firebase.database.DatabaseException: Objekt vom Typ java.lang.String kann nicht in den Typ com.jenovaprojects.beanscard.updated_ui.database.Points konvertiert werden. " –

Verwandte Themen