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



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

我在stack上找到了类似的帖子,但我仍然无法让它发挥作用。

我已经做了好几天了,所以我们非常感谢您的帮助。

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")+"");
}
}

相关内容

最新更新