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!?
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
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. –