我在点击适配器内的布局时运行了一个事务,但是当我单击布局时,事务成功运行。但它会在<xsl:value-of select="Phone_Numbers_-_Home/@Descriptor" separator=";"/>
内创建另一个项目。我在事务中尝试了notifydatasetChanged(),但它创建了一个错误:
RecyclerView
然后我尝试将notifyDataSetChanged()置于事务之外,但它无效。以下是我正在做的事情:
CalledFromWrongThreadException: Only the original thread that created a view
hierarchy can touch its views.
我认为当我将数据添加到我的列表中时,关注者值的变化会导致它添加一个新项目,我不确定
holder.follow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
DatabaseReference mWorkDatabase =
FirebaseDatabase.getInstance().getReference()
.child("WorkforWorkMen").child(work_id).child("follower");
mWorkDatabase.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData
mutableData) {
if(holder.followText.getText().equals("Follow")) {
holder.followText.setText("Following");
FirebaseAuth mAuth = FirebaseAuth.getInstance();
String current_user =
mAuth.getCurrentUser().getUid();
DatabaseReference mFollowingDatabase =
FirebaseDatabase.getInstance().getReference()
.child("WorkFollowing").child(current_user).child(work_id);
final Map fol = new HashMap();
fol.put("follower",work_id);
mFollowingDatabase.setValue(fol);
mutableData.setValue
(Integer.parseInt(mutableData.getValue().toString()) + 1);
}
else {
holder.followText.setText("Follow");
FirebaseAuth mAuth = FirebaseAuth.getInstance();
String current_user =
mAuth.getCurrentUser().getUid();
DatabaseReference mFollowingDatabase =
FirebaseDatabase.getInstance().getReference()
.child("WorkFollowing").child(current_user).child(work_id);
mFollowingDatabase.setValue(null);
mutableData.setValue(Integer
.parseInt(mutableData.getValue().toString()) - 1);
}
return Transaction.success(mutableData);
}
@Override
public void onComplete(DatabaseError databaseError,
boolean b, DataSnapshot dataSnapshot) {
Toast.makeText(context,"error on complete"+
String.valueOf(databaseError), Toast.LENGTH_SHORT).show();
Log.i("eror here", "onComplete:
"+String.valueOf(databaseError));
}
});
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "here",
Toast.LENGTH_SHORT).show();
notifyDataSetChanged();
}
});
}
});
答案 0 :(得分:1)
您正在从后台notifyDataSetChanged()
调用thread
,您需要按如下方式从ui thread
调用
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
答案 1 :(得分:1)
Firebase数据库客户端在后台线程中运行所有网络操作。这意味着您不能在该后台线程内create
或modify
视图。您只能在创建这些视图的线程中修改UI。但是,允许您进行这些更改的线程是主线程。因此,您需要做的是从事务中获取以下代码行。
notifyDataSetChanged();
注意::整个视图树是单线程的。因此,在任何视图上调用任何方法时,您必须始终在UI线程上。如果您正在其他线程上工作,并且想要从该线程更新视图状态,则应使用Handler
。
您可以找到更多here。