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

时间:2019-01-12 04:04:33

标签: java android firebase firebase-realtime-database

我正在使用Recycleview适配器显示Firebase实时数据库中的项目列表。 我有一个按钮,当单击该按钮时,它最初会显示Firebase的文本值,它将更改Firebase数据库中的相同键值,我也希望它也显示Button中的更新文本。

但是,除非退出活动并重新打开活动,否则它不会。然后,它将在Button文本中显示更新的值,而不是初始值。

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

我使用了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();
    }
}

xml代码是

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/my_card_view"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginBottom="3dp"
        android:layout_marginTop="4dp" >
        
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:padding="2dp" >
          
          <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight=".9"
                android:layout_marginBottom="5dp">

                <ImageView
                    android:id="@+id/imageView"
                    android:layout_width="75dp"
                    android:layout_height="75dp"
                    android:scaleType="fitXY"
                    android:padding="2dp" />

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical"
                    android:paddingLeft="8dp"
                    android:paddingRight="7dp"
                    android:gravity="left">

                    <TextView
                        android:id="@+id/book_name"
                        android:layout_width="match_parent"
                        android:layout_height="0dp"
                        android:layout_weight=".4"
                        android:text="Book Name"
                        android:textStyle="bold"
                        android:fontFamily="sans-serif-condensed"
                        android:textAppearance="?android:attr/textAppearanceLarge"
                        android:layout_margin="1dp"/>
                 
                   <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal">

                    <TextView
                        android:id="@+id/seller_name"
                        android:layout_width="match_parent"
                        android:fontFamily="sans-serif"
                        android:layout_height="35dp"
                        android:layout_weight=".3"
                        android:text="Seller"
                        android:layout_margin="2dp"
                        android:textAppearance="?android:attr/textAppearanceMedium" />

                    <Button
                       android:fontFamily="sans-serif-condensed"
                       android:gravity="center"
                       android:textColor="#ffffff"
                       android:text="Remove"
                       android:textStyle="bold"
                       android:layout_marginEnd="15dp"
                       android:textAppearance="?android:attr/textAppearanceSmall"
                       android:layout_marginRight="15dp"
                       android:layout_width="wrap_content"
                       android:id="@+id/book_solved"
                       android:textAllCaps="false"
                       android:layout_height="35dp"
                       android:background="@drawable/buttonshape1"
                       android:padding="8dp"
                       android:layout_toRightOf="@id/seller_name"/>
                    </LinearLayout>
                </LinearLayout>
            </LinearLayout>

            <LinearLayout
                android:orientation="horizontal"
                android:layout_marginTop="4dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <TextView
                    android:id="@+id/profile_details"
                    android:layout_width="match_parent"
                    android:layout_height="35dp"
                    android:fontFamily="sans-serif-condensed"
                    android:text="View Details"
                    android:background="@drawable/buttonshape1"
                    android:gravity="center"
                    android:textColor="#ffffff"
                    android:textStyle="bold"
                    android:layout_marginEnd="15dp"
                    android:textAppearance="?android:attr/textAppearanceMedium"
                    android:layout_marginRight="15dp" />
            </LinearLayout>
        </LinearLayout>
    </android.support.v7.widget.CardView>
</LinearLayout>

谢谢。

1 个答案:

答案 0 :(得分:1)

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

在这里说,您正在使用此代码在TextView上设置“书名”的值。

Books g = bookslist.get(position);    
holder.bookName.setText(g.getBname());

现在,如果要更改Button上的书名的值,则必须更改ArrayList模型中的值,然后通知它。

Books g = bookslist.get(position);    
g.setBname("your new value");

此后,您的notifyItemChanged(position)将显示新值。 notifyRecyclerView中的工作方式就是这样

为什么要这么做?

无论何时在RecylerView中调用通知,它都会再次从ArrayList中设置值。但是对于您而言,该值不会在列表中本地更新,而是在FireBase中更新。这就是为什么只要您再次打开应用程序就可以获取更新的值。

注意

要使用文本Remove更改Button的值,请在Markid的数据更改中获取FireBase。然后在ArrayList中为String 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) } 中的相应模型中设置该值。

Account             Amount
------------       ..............
10101               5000
10012               6000
10101              -2000
10012              -9000
10101               2000
10012               7000
10101              -1000
10012              -1500