在ArrayAdapter和getView中运行firebase事务

时间:2016-04-20 14:38:35

标签: transactions firebase android-arrayadapter

你可以在数组适配器和getView中运行firebase事务吗?

      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之后) 我已经尝试了几种方法,通过在click侦听器中传递一个方法(即submitRating();)并创建该方法传递相同的代码,并且发生相同的行为,我也尝试使用setValue而不进行事务处理,同样的事情还在继续!?

有人可以向我解释这种行为,是因为阵列适配器和获取视图或我的代码出了什么问题,我无法发现!?

                  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 个答案:

答案 0 :(得分:1)

与Firebase中的许多操作(以及一般的现代Web)一样,异步调用事务处理程序。您可以通过添加一些日志语句轻松地看到这一点:

runTransaction()

与您的预期不同,输出将是:

  

在runTransaction()之前

     

runTransaction()

之后      

内部doTransaction()

原因是要运行事务,Firebase客户端可能需要调用它来获取服务器以获取该位置的当前值。这是一个异步操作。为防止阻止程序,客户端继续 {{1}}调用之后的下一个语句。然后,当客户端确定当前值时,它会调用您的回调。