回收站视图中的重复项目,notifydatasetchanged不起作用

时间:2018-06-19 10:27:20

标签: java android firebase firebase-realtime-database android-recyclerview

我在点击适配器内的布局时运行了一个事务,但是当我单击布局时,事务成功运行。但它会在<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();
                    }
                });

            }
        });

2 个答案:

答案 0 :(得分:1)

您正在从后台notifyDataSetChanged()调用thread,您需要按如下方式从ui thread调用

new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {

                notifyDataSetChanged();
            }
        });

答案 1 :(得分:1)

Firebase数据库客户端在后台线程中运行所有网络操作。这意味着您不能在该后台线程内createmodify视图。您只能在创建这些视图的线程中修改UI。但是,允许您进行这些更改的线程是主线程。因此,您需要做的是从事务中获取以下代码行。

notifyDataSetChanged();

注意::整个视图树是单线程的。因此,在任何视图上调用任何方法时,您必须始终在UI线程上。如果您正在其他线程上工作,并且想要从该线程更新视图状态,则应使用Handler

您可以找到更多here