你可以在数组适配器和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();
}
}
});
}
});
答案 0 :(得分:1)
与Firebase中的许多操作(以及一般的现代Web)一样,异步调用事务处理程序。您可以通过添加一些日志语句轻松地看到这一点:
runTransaction()
与您的预期不同,输出将是:
在runTransaction()之前
runTransaction()
之后内部doTransaction()
原因是要运行事务,Firebase客户端可能需要调用它来获取服务器以获取该位置的当前值。这是一个异步操作。为防止阻止程序,客户端继续 {{1}}调用之后的下一个语句。然后,当客户端确定当前值时,它会调用您的回调。