Как показать обновленный адаптер RecycleView при нажатии внутри держателя Bindview? - PullRequest
0 голосов
/ 12 января 2019

Я использую Recycleview Adapter, чтобы показать мой список элементов из базы данных Firebase в реальном времени. У меня есть кнопка, которая первоначально отображает текстовое значение из Firebase, при щелчке изменит то же значение ключа в базе данных Firebase, и я хочу, чтобы он также отображал обновленный текст в 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 голосов
/ 12 января 2019

Независимо от значения, которое вы хотите изменить в своем адаптере, вы можете сделать, используя 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) отобразит новое значение. Вот как notify работает в RecyclerView

Почему вы должны это сделать?

Всякий раз, когда уведомление вызывается в RecylerView, оно снова устанавливает значение из ArrayList. Но в вашем случае значение не обновляется локально в вашем списке, а обновляется в FireBase. Вот почему вы получаете обновленное значение каждый раз, когда вы снова открываете свое приложение.

Примечание

Чтобы изменить значение 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...