如何在 Firebase RecyclerView Cardview 中单击项目时使用 onClickListener 打开新的 activity

How to open new activity with onClickListener when an item is clicked in Firebase RecyclerView Cardview

我正在使用 recyclerView 来显示来自 Firestore 的收据列表,我已经完成并可以在这里看到(https://i.stack.imgur.com/tuGQ4.png).现在我想点击列表并转到一个新的 activity,其中包含有关该收据的更多详细信息。我关注了一个在线视频,目前当你点击一个列表时,它会显示该项目在 firestore 中的位置。我想 单击 卡片视图中的任何收据,然后转到显示有关该收据的更多详细信息的新 activity。正如您在我的 firebase 和列表视图中看到的那样,我只从 firestore 中提取 'store'、'total' 和日期,但在这个新的 activity 中,您将看到与该收据相关的所有字段。

我在堆栈上发现了类似的 post,但我仍然无法让它工作。

我已经在这里工作好几天了,非常感谢任何帮助。

ReceiptActivity.java

public class ReceiptActivity extends AppCompatActivity {

private RecyclerView mFirestoreList;
private FirebaseFirestore db = FirebaseFirestore.getInstance();
private ReceiptAdapter adapter;
private CollectionReference receiptRef = db.collection( "users" )
        .document( "BtliRhtVFiQntlH2Hp1gvjG59b32" )
        .collection( "Receipts" );

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate( savedInstanceState );
    setContentView( R.layout.activity_receipt );

    mFirestoreList = findViewById(R.id.firestore_List);
    setUpRecyclerView();
}

private void setUpRecyclerView() {
    Query query = receiptRef = db.collection( "users" )
            .document( "BtliRhtVFiQntlH2Hp1gvjG59b32" )
            .collection( "Receipts" );

    FirestoreRecyclerOptions<ReceiptsModel> options = new FirestoreRecyclerOptions.Builder<ReceiptsModel>()
            .setQuery( query, ReceiptsModel.class )
            .build();

    //View holder class

    adapter = new ReceiptAdapter( options );
    mFirestoreList  = findViewById( R.id.firestore_List );
    mFirestoreList.setHasFixedSize( true );
    mFirestoreList.setLayoutManager( new LinearLayoutManager( this ) );
    mFirestoreList.setAdapter( adapter );

    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) {
            adapter.deleteItem( viewHolder.getAdapterPosition() );

        }
    } ).attachToRecyclerView( mFirestoreList );

    adapter.setOnItemClickListener(new ReceiptAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(DocumentSnapshot documentSnapshot, int position) {
            ReceiptsModel receiptsModel = documentSnapshot.toObject(ReceiptsModel.class);
            String id = documentSnapshot.getId();
            String path = documentSnapshot.getReference().getPath();
            Toast.makeText(ReceiptActivity.this,
                    "Position: " + position + " ID: " + id, Toast.LENGTH_SHORT).show();
        }
    });
}
@Override
protected void onStop() {
    super.onStop();
    adapter.stopListening();
}


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

ReceiptAdapter.java

public class ReceiptAdapter extends     FirestoreRecyclerAdapter<ReceiptsModel, ReceiptAdapter.ReceiptHolder> {
private OnItemClickListener listener;


public ReceiptAdapter(@NonNull FirestoreRecyclerOptions<ReceiptsModel> options) {
    super( options );
}

@Override
protected void onBindViewHolder(@NonNull ReceiptHolder holder, int i, @NonNull ReceiptsModel model) {
    holder.view_date.setText(model.getDate());
    holder.view_store.setText(model.getStore());
    holder.view_total.setText(String.valueOf(model.getTotal()));

}


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

//delete receipt in the card view
public void deleteItem(int position) {
    getSnapshots().getSnapshot( position ).getReference().delete();
}

 class ReceiptHolder extends RecyclerView.ViewHolder {
    TextView view_date;
    TextView view_total;
    TextView view_store;


    public ReceiptHolder(@NonNull View itemView) {
        super( itemView );
        view_date = itemView.findViewById(R.id.view_date);
        view_store = itemView.findViewById(R.id.view_store);
        view_total = itemView.findViewById(R.id.view_total);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION && listener != null) {
                    listener.onItemClick( getSnapshots().getSnapshot( position ), position );
                }

                }
            });
        }
    }
public interface OnItemClickListener {
    void onItemClick(DocumentSnapshot documentSnapshot, int position);

}
public void setOnItemClickListener(OnItemClickListener listener) {
    this.listener = listener;
}
}

第 1 步 - 在您的 ReceiptActivity 中进行小的更改

adapter.setOnItemClickListener(new ReceiptAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(DocumentSnapshot documentSnapshot, int position) {
            ReceiptsModel model = documentSnapshot.toObject(ReceiptsModel.class);
            
            Intent intent = new Intent(ReceiptActivity.this,DetailsActivity.class);
            intent.putExtra("date",model.getDate());
            intent.putExtra("email",model.getEmail());
            intent.putExtra("store",model.getStore());
            intent.putExtra("total",model.getTotal());
            startActivity(intent);
        }
    });

步骤 2

在 activity_details.xml 中使用 4 个文本视图创建 DetailsActivity(文本视图的 ID 日期、电子邮件、商店、总计)

public class DetailsActivity extends AppCompatActivity {
    TextView date,email,store,total;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_details);
        date = findViewById(R.id.date);
        email = findViewById(R.id.email);
        store = findViewById(R.id.store);
        total = findViewById(R.id.total);
        date.setText(getIntent().getStringExtra("date")+"");
        email.setText(getIntent().getStringExtra("email")+"");
        store.setText(getIntent().getStringExtra("store")+"");
        total.setText(getIntent().getStringExtra("total")+"");
    }
}