2017-11-04 1 views
0

Hallo all Ich habe dieses Problem gründlich erforscht und ich sah, es gab ein paar Themen auf Stack über dieses Problem, aber keine Antworten. Wenn jemand mir eine Lösung geben kann, würde ich es wirklich schätzen. Hier ist mein Code:Fehler "Objekt vom Typ java.lang.String kann nicht in Typ konvertiert werden"

public class Deliveries extends Fragment { 
    DatabaseReference dbRef; 
    FirebaseDatabase myRef; 
    List<customerInfo>myList; 
    View delView; 
    RecyclerView custCards; 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     delView = inflater.inflate(R.layout.activity_delivery_card_layout,container,false); 
     custCards = (RecyclerView)delView.findViewById(R.id.recyclerViewResults); 
     myRef = FirebaseDatabase.getInstance(); 
     dbRef = myRef.getReference("customers123456"); 
     custCards.setHasFixedSize(true); 
     custCards.setLayoutManager(new LinearLayoutManager(delView.getContext())); 

     dbRef.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       myList = new ArrayList<customerInfo>(); 
       for(DataSnapshot snapshot:dataSnapshot.getChildren()){ 
        customerInfo val = snapshot.getValue(customerInfo.class); 
        customerInfo customerInfo = new customerInfo(); 

        String nme,id,delType,km; 
        nme = val.getCustName(); 
        id = val.getCustID(); 
        delType = val.getDeliveryType(); 
        km = val.getKmTravel(); 

        customerInfo.setCustName(nme); 
        customerInfo.setCustID(id); 
        customerInfo.setDeliveryType(delType); 
        customerInfo.setKmTravel(km); 

        myList.add(customerInfo); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
     RecyclerAdapter recyclerAdapter = new RecyclerAdapter(myList,delView.getContext()); 
     custCards.setItemAnimator(new DefaultItemAnimator()); 
     custCards.setAdapter(recyclerAdapter); 
     return delView; 
    } 
} 

die Daten aus Firebase gezogen wird, um eine cardview zu füllen. Hier ist meine recycle Ansicht Adapterklasse:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.Viewholder> { 
    Context context; 
    List<customerInfo> info; 

    public RecyclerAdapter(List<customerInfo> temp,Context _context){ 
     this.context = _context; 
     info = temp; 
    } 

    @Override 
    public RecyclerAdapter.Viewholder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View myView = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_delivery,parent,false); 
     Viewholder viewholder = new Viewholder(myView); 
     return viewholder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerAdapter.Viewholder holder, int position) { 
     customerInfo myLst = info.get(position); 
     holder.cName.setText(myLst.getCustName()); 
     holder.cID.setText(myLst.getCustID()); 
     holder.cDel.setText(myLst.getDeliveryType()); 
     holder.cKm.setText(myLst.getKmTravel()); 
    } 

    @Override 
    public int getItemCount() { 
     return 0; 
    } 

    public class Viewholder extends RecyclerView.ViewHolder{ 
     public TextView cName; 
     public TextView cID; 
     public TextView cDel; 
     public TextView cKm; 

     public Viewholder(View item){ 
      super(item); 
      cName = (TextView)item.findViewById(R.id.txtvwCustNme); 
      cID = (TextView)item.findViewById(R.id.txtvwCustID); 
      cDel = (TextView)item.findViewById(R.id.txtvwDelType); 
      cKm = (TextView)item.findViewById(R.id.txtvwEstKm); 
     } 
    } 
} 

und dies ist meine Kunden Informationen Klasse:

public class customerInfo { 
    public String custName; 
    public String custID; 
    public String deliveryType; 
    public String kmTravel; 


    public String getCustID() { 
     return custID; 
    } 

    public void setCustID(String custID) { 
     this.custID = custID; 
    } 

    public String getKmTravel() { 
     return kmTravel; 
    } 


    public String getCustName() { 
     return custName; 
    } 

    public String getDeliveryType() { 
     return deliveryType; 
    } 

    public void setCustName(String custName) { 
     this.custName = custName; 
    } 

    public void setDeliveryType(String deliveryType) { 
     this.deliveryType = deliveryType; 
    } 

    public void setKmTravel(String kmTravel) { 
     this.kmTravel = kmTravel; 
    } 
} 

Wie ich schon sagte, bevor ich dieses Problem zu lösen versucht haben, von bei früheren Probleme suchen, waren gepostet auf Stack, aber kein Glück. Ich habe eine andere Klasse, wo es von Feuerbasis zieht und es funktioniert perfekt, der Unterschied zwischen den beiden Klassen ist dies:

Lieferungen Klasse (Doesnt Arbeit):

customerInfo val = snapshot.getValue(customerInfo.class); 

Startseite Klasse (Werke):

myData.add(snapshot.getValue(String.class)); 

meine genauen Fehler aus dem android-Monitor:

FATAL EXCEPTION: main 
                      Process: com.example.anthe.question2, PID: 4947 
                      com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.anthe.question2.customerInfo 
                       at com.google.android.gms.internal.zzbtg.zze(Unknown Source) 
                       at com.google.android.gms.internal.zzbtg.zzb(Unknown Source) 
                       at com.google.android.gms.internal.zzbtg.zza(Unknown Source) 
                       at com.google.firebase.database.DataSnapshot.getValue(Unknown Source) 
                       at com.example.anthe.question2.Deliveries$1.onDataChange(Deliveries.java:44) 
                       at com.google.android.gms.internal.zzbpx.zza(Unknown Source) 
                       at com.google.android.gms.internal.zzbqx.zzZV(Unknown Source) 
                       at com.google.android.gms.internal.zzbra$1.run(Unknown Source) 
                       at android.os.Handler.handleCallback(Handler.java:751) 
                       at android.os.Handler.dispatchMessage(Handler.java:95) 
                       at android.os.Looper.loop(Looper.java:154) 
                       at android.app.ActivityThread.main(ActivityThread.java:6692) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) 

die Datenbank stru cture: db structure

+0

Gießfehler. Debuggen Sie Ihren Code. – ADM

+0

versuchte Debugging. Es hat nicht funktioniert. –

+0

Debugging wird nicht funktionieren. Es wird Sie den Fehler finden. Überprüfen Sie den Objekttyp in der Zeilennummer, an der Sie die Ausnahme erhalten. Sie übergeben eine Zeichenfolge an ein Concrete-Klassenobjekt. – ADM

Antwort

0

Ich weiß nicht die Struktur Ihres Codes, aber ich denke, myRef.getReference("customers123456") ist bereits erhalten einen Verweis auf bestimmte Benutzer.

Wenn Sie eine Schleife durch alle Kinder for(DataSnapshot snapshot:dataSnapshot.getChildren()) die snapshot verwendet, wird ein Attribut/Element Ihrer customerInfo Klasse sein (zB: CustName -, die einen String repräsentieren)

So sollten Sie die Schleife entfernen, oder Verweis auf Eltern erhalten von diesem Knoten "customers123456", um eine Liste Ihrer Kunden zu erhalten.

+0

Zu dieser Zeit gibt es Dummy-Text in den Daten für Testzwecke, wenn die Anwendung funktioniert, es sollte eine Vielzahl von Daten ziehen und automatisch eine Kartenansicht ausfüllen. Ich verstehe nicht, wie das Entfernen meiner Schleife den Fehler beheben wird, denn soweit ich verstehe, wird mir vom Android-Monitor gesagt, dass ich einen Typ String nicht in ein Klassenattribut konvertieren kann, aber das Klassenattribut ist ein String, alle Attribute sind ein String . –

+0

@Lady_A Ich weiß, dass alle Attribute Ihrer Klasse ein String ist. Bitte geben Sie mir Ihre Datenstruktur, vor allem diesen Knoten "customers123456" – nhoxbypass

+0

okay, ich werde versuchen, es auszugeben - customers123456 als die Kinder sind wie folgt: custName1, custId1, delType1, estKm1. Der customers123456 Knoten ist ein Kind des Hauptknotens "question2-866c1" –

Verwandte Themen