Java 如何在Bindview支架内单击时显示更新的RecycleView适配器?

Java 如何在Bindview支架内单击时显示更新的RecycleView适配器?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在使用Recycleview适配器显示Firebase实时数据库中的项目列表。 我有一个按钮,显示从Firebase最初的文本值时,点击会改变Firebase数据库中相同的键值,我希望它显示更新后的文本按钮太多 但除非退出活动并重新打开活动,否则不会发生这种情况。然后,它会在按钮文本中显示更新后的值,而不是初始值 如何在不退出适配器的情况下更新和显示值 我使用了notifyItemChanged(position),但它没有任何作用 这是我的密码 public class SubjectBo

我正在使用Recycleview适配器显示Firebase实时数据库中的项目列表。 我有一个按钮,显示从Firebase最初的文本值时,点击会改变Firebase数据库中相同的键值,我希望它显示更新后的文本按钮太多

但除非退出活动并重新打开活动,否则不会发生这种情况。然后,它会在按钮文本中显示更新后的值,而不是初始值

如何在不退出适配器的情况下更新和显示值

我使用了
notifyItemChanged(position)
,但它没有任何作用

这是我的密码

public class SubjectBooksAdapter extends RecyclerView.Adapter<SubjectBooksAdapter.MyViewHolder> {
    ArrayList<Books> bookslist;
    CardView cv;
    FirebaseAuth fauth;
    FirebaseDatabase database;
    DatabaseReference dbreference;
    Books g;
    SubjectBooksAdapter adapter;



    public SubjectBooksAdapter(ArrayList<Books> bookslist){
        this.bookslist = bookslist;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout,parent,false);
        return new MyViewHolder(v);

    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        Button mSolved;
        MyViewHolder(final View itemView) {
            super(itemView);
            database = FirebaseDatabase.getInstance();
            dbreference = database.getReference("books");
            dbreference.keepSynced(true);
            mSolved = (Button) itemView.findViewById(R.id.book_solved);

        }
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {

        database = FirebaseDatabase.getInstance();
        dbreference = database.getReference("books");

        g = bookslist.get(position);


        holder.mSolved.setText(g.getMarkid());
        holder.bookName.setText(g.getBname());
        holder.bookprice.setText("Rs. "+g.getPrice());
        holder.sellername.setText(g.getSellername());



        holder.mSolved.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
            DatabaseReference classicalMechanicsRef = rootRef.child("books").child(g.getCondition()).child(g.getBookid());
            ValueEventListener valueEventListener = new ValueEventListener() {

                @Override
             public void onDataChange(DataSnapshot dataSnapshot) {
            dataSnapshot.child("bmark").getRef().setValue("Solved");
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
};
classicalMechanicsRef.addListenerForSingleValueEvent(valueEventListener);


notifyItemChanged(position);
            }

        });



    @Override
    public int getItemCount() {
        return bookslist.size();
    }
}
公共类SubjectBookAdapter扩展了RecyclerView.Adapter{
ArrayList图书列表;
卡德维尤简历;
弗斯;
Firebase数据库;
数据库引用dbreference;
书籍g;
对象适配器;
公共主题BookAdapter(ArrayList bookslist){
this.bookslist=bookslist;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.layout,parent,false);
返回新的MyViewHolder(v);
}
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
按钮已解决;
MyViewHolder(最终视图项目视图){
超级(项目视图);
database=FirebaseDatabase.getInstance();
dbreference=database.getReference(“图书”);
dbreference.keepSynced(true);
mssolved=(按钮)itemviewbyd(R.id.book\u solved);
}
}
@凌驾
公共无效onBindViewHolder(最终MyViewHolder,最终int位置){
database=FirebaseDatabase.getInstance();
dbreference=database.getReference(“图书”);
g=bookslist.get(位置);
holder.mSolved.setText(g.getMarkid());
holder.bookName.setText(g.getBname());
holder.bookprice.setText(“Rs.”+g.getPrice());
holder.sellername.setText(g.getSellername());
holder.msresolved.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
DatabaseReference rootRef=FirebaseDatabase.getInstance().getReference();
DatabaseReference classicalMechanicsRef=rootRef.child(“books”).child(g.getCondition()).child(g.getBookid());
ValueEventListener ValueEventListener=新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
dataSnapshot.child(“bmark”).getRef().setValue(“已解决”);
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
};
ClassicalMechanisRef.addListenerForSingleValueEvent(valueEventListener);
(职位)变更;
}
});
@凌驾
public int getItemCount(){
返回bookslist.size();
}
}
xml代码是


无论您想在适配器中更改什么值,您都可以使用
notifyItemChanged(position)
NotifyItemChange
仅在模型类发生更改时才起作用

假设您正在使用此代码在
TextView
上设置图书名称的值

Books g = bookslist.get(position);    
holder.bookName.setText(g.getBname());
现在,如果您想更改
按钮上图书名称的值
单击,您必须更改
阵列列表
模型中的值,然后通知它

Books g = bookslist.get(position);    
g.setBname("your new value");
在此之后,您的
notifyItemChanged(position)
将显示新值。这就是
notify
RecyclerView中的工作方式

你为什么要这么做?

无论何时在
RecylerView
中调用notify,它都会再次从
ArrayList
中设置值。但在您的情况下,该值不会在列表中本地更新,而是在
FireBase
中更新。这就是为什么您每次再次打开应用程序时都会获得更新值的原因

注意

要使用text Remove更改
按钮的值,请在
FireBase
的Datachange中获取
Markid
。然后从
ArrayList
字符串
Markid
在相应的模型(该位置)中设置该值

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    dataSnapshot.child("bmark").getRef().setValue("Solved");
    // Here you need to save the value in the arraylist.   
    bookslist.get(position).setMardid("Here what ever the value you will pass will get updated on the button after notify"); //Try adding the static string that you want after button click.
    notifyItemChanged(position)
}

所以任何解决方案我都可以用notifyItemChanged(position)来代替;?我没听清你的问题。因为notifyItemChanged(position);不要显示按钮的更新文本值,除非我通过反按完成活动并重新打开它。那么,有没有办法在按下按钮后立即显示更新的值。按钮最初的值是多少?我打开了一个新的线程,有更多的说明。请看一看