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