滑动删除项目以将其标记为已删除已使用Firestore后,如何在RecyclerView中显示布局?

问题描述

不知道如何更好地表达我的问题。

我目前正在研究一个应用程序,该应用程序允许猎人在日记中进行录入。 这些条目将保存在FirebaseFireStore集合中。 我已经实现了一种通过滑动删除条目的方法。

日志条目是在CardView中设计的,具有两个RelativeLayouts-foreGround,用于显示实际的日志条目和backGround,backGround只是一个带有删除图标的红色字段,默认情况下设置为不可见。

我只希望在滑动从RecyclerView中删除项目时显示backGround,以便用户可以看到他/她正在删除条目的提醒。

代码如下(很抱歉,如果代码混乱/不便。这是我第一次编写这种大小的代码):

journal_item.xml以获取RecyclerView中的条目

<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
                                   android:layout_width="match_parent"
                                   android:layout_height="wrap_content"
                                   xmlns:app="http://schemas.android.com/apk/res-auto"
                                   android:layout_marginStart="8dp" android:layout_marginTop="8dp"
                                   android:layout_marginEnd="8dp"
                                   app:cardBackgroundColor="#FFFFF8" >

    <RelativeLayout
            android:id="@+id/view_background"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/bg_row_background"
            android:visibility="invisible">

        <ImageView
                android:id="@+id/delete_icon"
                android:layout_width="@dimen/ic_delete"
                android:layout_height="@dimen/ic_delete"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_marginRight="@dimen/padd_10"
                android:src="@android:drawable/ic_menu_delete"/>

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginRight="@dimen/padd_10"
                android:layout_toLeftOf="@id/delete_icon"
                android:text="@string/delete"
                android:textColor="#fff"
                android:textSize="13dp" />

    </RelativeLayout>


    <RelativeLayout
            android:layout_width="match_parent" android:layout_height="match_parent"
            android:padding="8dp" android:id="@+id/viewForeground">

        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                  android:id="@+id/date_View" android:text="yyyy-MM-dd HH:mm:ss"
                  android:textAppearance="@style/TextAppearance.AppCompat.Small"
                  android:layout_alignParentTop="true"
                  android:layout_alignParentStart="true" android:maxLines="1"
                   />

        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                  android:id="@+id/location_View" android:text="Location"
                  android:textAlignment="viewEnd"
                  android:textAppearance="@style/TextAppearance.AppCompat.Small"
                  android:layout_alignParentTop="true"
                  android:maxLines="1" android:layout_toEndOf="@+id/date_View"
                  android:layout_alignParentEnd="true" android:ellipsize="end"/>

        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                  android:id="@+id/shot_View" android:text="Schüsse: 3"
                  android:maxLines="1"
                  android:layout_alignParentStart="true" android:layout_below="@+id/date_View"/>

        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                  android:id="@+id/hit_View" android:text="Treffer: 1"
                  android:layout_below="@+id/date_View" android:maxLines="1"
                  android:layout_toEndOf="@+id/shot_View" android:layout_marginStart="10dp"/>

        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                  android:id="@+id/caliber_View" android:text="Kaliber: 0.9"
                  android:maxLines="1" android:layout_marginStart="10dp"
                  android:layout_toEndOf="@+id/hit_View" android:layout_below="@+id/date_View"/>

        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                  android:id="@+id/target_View" android:text="Ziel: Wildschwein"
                  android:layout_below="@+id/shot_View" android:maxLines="1" />

        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                  android:id="@+id/mean_View" android:text="Zweck: Warnschuss"
                  android:layout_marginStart="10dp"
                  android:layout_below="@+id/shot_View"
                  android:layout_toEndOf="@+id/target_View" android:maxLines="1"  />

</RelativeLayout>
</androidx.cardview.widget.CardView>

RecyclerView的activity_hunterjournal.xml:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                                   xmlns:app="http://schemas.android.com/apk/res-auto"
                                                   xmlns:tools="http://schemas.android.com/tools"
                                                   android:layout_width="match_parent"
                                                   android:layout_height="match_parent"
                                                   android:background="@drawable/background"
                                                   tools:context=".HunterJournal" 
                                                   android:id="@+id/first_Lvl_Layout">
[...]
<androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/journal_View"
                    android:layout_width="281dp"
                    android:layout_height="302dp"
                    android:layout_marginTop="56dp"
                    android:scrollbars="vertical"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent"/>
[...]
</androidx.constraintlayout.widget.ConstraintLayout>

FirestoreRecyclerAdapter

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.jagdrevierapp.data.model.Journal;
import com.firebase.ui.firestore.FirestoreRecyclerAdapter;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;

public class JournalAdapter extends FirestoreRecyclerAdapter<Journal,JournalAdapter.JournalHolder> {

    //Constructor
    public JournalAdapter(FirestoreRecyclerOptions<Journal> options) {
        super(options);
    }


    @Override
    protected void onBindViewHolder(JournalHolder journalHolder,int i,Journal journal) {

        journalHolder.shotView.setText("Schüsse: " + journal.getShots());
        journalHolder.hitView.setText("Treffer: " + journal.getHits());
        journalHolder.caliberView.setText("Kaliber:" + String.valueOf(journal.getCaliber()));
        journalHolder.targetView.setText("Ziel: " + journal.getTarget());
        journalHolder.meanView.setText("Zweck: " + journal.getMean());
        journalHolder.dateView.setText(journal.getDate().toString());
        journalHolder.locationView.setText(journal.getLocation().toString());
    }

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

    public void deleteItem(int position){

        getSnapshots().getSnapshot(position).getReference().delete();

    }

    
    class JournalHolder extends RecyclerView.ViewHolder{
       TextView shotView;
       TextView hitView;
       TextView caliberView;
       TextView targetView;
       TextView meanView;
       TextView dateView;
       TextView locationView;

       public RelativeLayout viewBackground;
       public RelativeLayout viewForeground;

       //Constructor
       public JournalHolder(View itemView) {
           super(itemView);
           shotView = itemView.findViewById(R.id.shot_View);
           hitView = itemView.findViewById(R.id.hit_View);
           caliberView = itemView.findViewById(R.id.caliber_View);
           targetView = itemView.findViewById(R.id.target_View);
           meanView = itemView.findViewById(R.id.mean_View);
           dateView = itemView.findViewById(R.id.date_View);
           locationView = itemView.findViewById(R.id.location_View);

           viewBackground = itemView.findViewById(R.id.view_background);
           viewForeground = itemView.findViewById(R.id.viewForeground);

       }
   }
}

我实现ItemToucHelper的HunterJournal-Activity:

import android.util.Log;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.jagdrevierapp.data.model.Journal;
import com.example.jagdrevierapp.data.model.User;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.firestore.*;
import com.google.firebase.firestore.Query;

import java.util.Objects;

public class HunterJournal extends AppCompatActivity  {

    private final String TAG = "HunterJournal";
    private final String COLLECTION_KEY = "User";
    private final String JOURNAL_COLLECTION_KEY = "HunterJournal";


    final FirebaseAuth mAuth = FirebaseAuth.getInstance();
    final FirebaseUser mFirebaseUser = mAuth.getCurrentUser();

    
    private final FirebaseFirestore db = FirebaseFirestore.getInstance();
    private final CollectionReference dbUser = db.collection(COLLECTION_KEY);
    private final CollectionReference dbJournal = dbUser.document(mFirebaseUser.getEmail())
            .collection(JOURNAL_COLLECTION_KEY);
    
    private JournalAdapter adapter;

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hunterjournal);
   
   [...]
        Query journalUser = dbJournal.orderBy("date",Query.Direction.DESCENDING);
        
        final RecyclerView journalView = findViewById(R.id.journal_View);
        journalView.setHasFixedSize(true);
        journalView.setLayoutManager(new LinearLayoutManager(this));
       
        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
            
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView,@NonNull RecyclerView.ViewHolder viewHolder,@NonNull RecyclerView.ViewHolder target) {
                return false;
            }
          
            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder,int direction) {
                if (viewHolder instanceof JournalAdapter.JournalHolder) {
                    adapter.deleteItem(viewHolder.getAdapterPosition());
                }
            }
        }).attachToRecyclerView(journalView);

        FirestoreRecyclerOptions<Journal> options = new FirestoreRecyclerOptions.Builder<Journal>()
                .setQuery(journalUser,Journal.class)
                .build();
      
        adapter = new JournalAdapter(options);

        journalView.setAdapter(adapter);
   } 

    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }
  
    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }
}

最后是Journal-Model类

import com.google.firebase.firestore.GeoPoint;

public class Journal {

    private int shots;
    private int hits;
    private double caliber;
    private String mean;
    private String target;
    private String date;
    private GeoPoint location;

    public Journal() {
    }

    public Journal(int shots,int hits,double caliber,String mean,String target,String date,GeoPoint 
     location) {

        this.shots = shots;
        this.hits = hits;
        this.caliber = caliber;
        this.mean = mean;
        this.target = target;
        this.date = date;
        this.location = location;
    }

    public int getShots() {
        return shots;
    }

    public void setShots(int shots) {
        this.shots = shots;
    }

    public int getHits() {
        return hits;
    }

    public void setHits(int hits) {
        this.hits = hits;
    }

    public double getCaliber() {
        return caliber;
    }

    public void setCaliber(double caliber) {
        this.caliber = caliber;
    }

    public String getMean() {
        return mean;
    }

    public void setMean(String mean) {
        this.mean = mean;
    }

    public String getTarget() {
        return target;
    }

    public void setTarget(String target) {
        this.target = target;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public GeoPoint getLocation() {
        return location;
    }

    public void setLocation(GeoPoint location) {
        this.location = location;
    }

}

希望这就是你们所需要的。预先感谢您与我打交道:)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)