2016-04-20 9 views
0

Könnten Sie eine Firebase-Transaktion innerhalb eines Array-Adapters und GetView als dies ausführen;Ausführen Firebase-Transaktion innerhalb ArrayAdapter und getView

 public class upImgAdapter extends ArrayAdapter { 

    public List<uploadedContentModels> upImgModelsList; 
    private int resource; 
    private LayoutInflater inflater; 

    public upImgAdapter(Context context, int resource, 
         List<uploadedContentModels> objects) { 
     super(context, resource, objects); 
     upImgModelsList = objects; 
     this.resource = resource; 
     inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 

    } 

    /** getting the view ref. to be implemented in the listview & declaring layout elements **/ 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent){ 

     if(convertView == null){ 
      convertView = inflater.inflate(resource, null); 
     } 

     /** passing the image to the UIL **/ 

     ImageView imageViewDisplayMemebers; 
     imageViewDisplayMemebers = (ImageView)convertView.findViewById(R.id.imageViewDisplayMemebers); 

     ImageLoader.getInstance().displayImage(upImgModelsList.get(position).getAddress(), imageViewDisplayMemebers); 
     final String imgToBeRatedRef = upImgModelsList.get(position).getPublic_id(); 

     RatingBar ratingBar; 
     ratingBar = (RatingBar)convertView.findViewById(R.id.ratingBar); 
     ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() { 
      @Override 
      public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { 
       newRatingImg = (ratingBar.getRating()); 
      } 
     }); 

     Button buttonRatingSubm; 
     buttonRatingSubm = (Button)convertView.findViewById(R.id.buttonRatingSubm); 
     buttonRatingSubm.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v){ 
       final Firebase firebaseRefRating = new Firebase("https://cloudname.firebaseio.com//data/images/" + imgToBeRatedRef + "/rating"); 
       firebaseRefRating.runTransaction(new Transaction.Handler() { 
        @Override 
        public Transaction.Result doTransaction(MutableData mutableData) { 
         int currentRating = (int) mutableData.getValue(); 
         int updatedRating = (currentRating + newRatingImg); 
         mutableData.setValue(updatedRating); 

         return Transaction.success(mutableData); 
        } 

        @Override 
        public void onComplete(FirebaseError firebaseError, boolean b, DataSnapshot dataSnapshot) { 

        } 
       }); 
      } 
     }); 

      return convertView; 

das Problem, das ich bin vor, dass, wenn ich laufe die Debug und nachdem ich die Taste clikc, ich sehe, dass die Ausführung von der Zeilenadresse springt

public Transaction.Result doTransaction(MutableData mutableData) { 

bis zum Ende des getView Verfahrens (nach der Rückkehr convertView) Ich habe mehrere Möglichkeiten versucht, indem Sie eine Methode innerhalb der Klick-Listener übergeben (dh submitRating();) und erstellt diese Methode den gleichen Code darin, und das gleiche Verhalten passiert, ich habe auch versucht, setValue zu verwenden ohne die Transaktion, und auch das gleiche ging weiter!?

könnte mir jemand dieses Verhalten erklären, ist es wegen des Array Adapters und der get view oder etwas falsch mit meinem Code, den ich nicht erkennen konnte!?

Antwort

1

Wie viele Vorgänge in Firebase (und dem modernen Web im Allgemeinen) wird der Transaktionshandler asynchron aufgerufen. Sie können dies leicht erkennen, indem sie ein paar Log-Anweisungen hinzu:

Vor runTransaction()

Nach runTransaction()

:

final Firebase firebaseRefRating = new Firebase("https://cloudname.firebaseio.com//data/images/" + imgToBeRatedRef + "/rating"); 
System.out.println("Before runTransaction()"); 
firebaseRefRating.runTransaction(new Transaction.Handler() { 
    public Transaction.Result doTransaction(MutableData mutableData) { 
     System.out.println("Inside doTransaction()"); 
     int currentRating = (int) mutableData.getValue(); 
     int updatedRating = (currentRating + newRatingImg); 
     mutableData.setValue(updatedRating); 

     return Transaction.success(mutableData); 
    } 
    public void onComplete(FirebaseError firebaseError, boolean b, DataSnapshot dataSnapshot) { 

    } 
}); 
System.out.println("After runTransaction()"); 

Im Gegensatz zu, was Sie erwarten können, wird der Ausgang sein

Innen doTransaction()

Die r Dazu muss der Firebase-Client möglicherweise einen Server aufrufen, um den aktuellen Wert am Standort zu erhalten. Dies ist eine asynchrone Operation. Um das Blockieren des Programms zu verhindern, fährt der Client mit der nächsten Anweisung nach den runTransaction() Aufruf fort. Wenn der Client den aktuellen Wert ermittelt hat, ruft er Ihren Rückruf auf.

+0

guter Tipp mit Protokoll, um die Schritte der Ausführung zu verfolgen, aber obwohl ich es angewendet habe, wie Sie in dem aktualisierten Beitrag sehen konnten, bekomme ich den Toast eines erfolgreichen Subm. aber keine Änderungen in der Nocke fallen auf? der Wert änderte sich nicht, ich stellte sicher, dass die Variablen "imgToBeRatedRef" & "newRating" nicht Null im Debug sind, aber ohne Änderungen an der Nocke? – JanusJanus

+1

Ersetzen Sie die Toasts mit regulären Protokollanweisungen, erfassen Sie die relevanten Ausgaben und posten Sie diese. Das erspart Ihnen Toasts zu beschreiben oder Screenshots von Text zu posten. –