2016-04-20 4 views
0

Не удалось запустить транзакцию firebase в адаптере Array и getView;Выполнение транзакции firebase в ArrayAdapter и 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; 

проблема я столкнулся, что, когда я запустить отладку и после того, как я clikc кнопки, я вижу, что выполнение переходит из адресной строки

public Transaction.Result doTransaction(MutableData mutableData) { 

до конца метода GetView (после возврата convertView) Я пробовал несколько способов, передав метод внутри прослушивателя кликов (т. е. submitRating();) и создал этот метод, передавая ему тот же код, и то же самое произошло, я также попытался использовать setValue без транзакции, а также то же самое продолжалось!?

Может кто-нибудь объяснить это поведение мне, это из-за Адаптер Array и получить представление или что-то не так с моим кодом, который я не мог определить!?

    public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { 
       ratingNew[0] = (ratingBar.getRating()); 
      } 
     }); 

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

      @Override 
      public void onClick(View v){ 
       Log.e("myTag","Before doTransaction()"); 

       final Firebase firebaseRefRating = new Firebase("https://wi4x4.firebaseio.com//data/images"); 
       firebaseRefRating.child(imgToBeRatedRef).child("rating").runTransaction(new Transaction.Handler() { 
        @Override 
        public Transaction.Result doTransaction(MutableData mutableData) { 
         Log.e("myTag","Inside doTransaction()"); 

         int currentRating = (int) mutableData.getValue(); 
         int updatedRating = (currentRating + ratingNew[0]); 
         mutableData.setValue(updatedRating); 
         Toast.makeText(getApplicationContext(), 
           "submitting rating" 
           , Toast.LENGTH_SHORT).show(); 
         return Transaction.success(mutableData); 
        } 

        @Override 
        public void onComplete(FirebaseError firebaseError, boolean b, DataSnapshot dataSnapshot) { 
         if(firebaseError != null){ 
          Log.e("myTag","After doTransaction()"); 

          Toast.makeText(getApplicationContext(), 
            "Rating Submitted" 
            , Toast.LENGTH_SHORT).show(); 
         }else { 
          Log.e("myTag","Error doTransaction()"); 

          Toast.makeText(getApplicationContext(), 
            "Error submitting rating failed" 
            , Toast.LENGTH_SHORT).show(); 
         } 
        } 
       }); 
      } 
     }); 

ответ

1

Как и многие операции в Firebase (и современный Интернет в целом), то обработчик транзакций времени вызывается асинхронно. Вы можете легко убедиться в этом, добавив несколько заявлений журнала:

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()"); 

В отличие от того, что вы можете ожидать, выход будет:

Перед runTransaction()

После runTransaction()

Внутри doTransaction()

r eason - это то, что для выполнения транзакции клиенту Firebase может потребоваться позвонить ему на сервер, чтобы получить текущее значение в местоположении. Это асинхронная операция. Чтобы предотвратить блокирование программы, клиент продолжает следующее заявление после звонка runTransaction(). Затем, когда клиент определил текущее значение, он вызывает ваш обратный вызов.

+0

Хороший совет с помощью журнала, чтобы следить за шагами выполнения, но даже при том, что я применил его, как вы могли видеть в обновленном сообщении, я получаю Тост успешной субстанции. но никаких изменений в кивок не начисляется? значение не изменилось, я убедился, что переменные «imgToBeRatedRef» и «newRating» не являются нулевыми в отладке, но без изменений в кивок? – JanusJanus

+1

Замените тосты обычными отчетами журнала, запишите соответствующий вывод и опубликуйте это. Это избавляет вас от необходимости описывать тосты или размещать скриншоты текста. –

Смежные вопросы