Android Java - RecyclerView with Firestore not Updating on I



我正在使用Firestore来保存代表有名字的人的文档。我正在使用RecyclerView来显示它们,并用显示从Firestore提取的名称的卡片填充它。我实现了一个滑动删除功能,当您在回收器视图中向左或向右滑动此人的卡时,该功能会从 Firestore 中删除该人。

我的问题是刷卡不会导致回收器视图更新 - 当我检查Firestore时,确实会发生删除,但回收器视图只是显示该卡以前所在的间隙。移除的卡下方的所有卡都不会"向上移动"以填充空白。

在包含 RecyclerView 的活动的 onCreate(( 中,我调用一个名为 setUpRecyclerView(( 的函数。这是该函数,其中包含用于滑动的代码:

private void setUpRecyclerView() {
// create the query who's results you want to populate the recyclerView with
Query query = clientsReference.orderBy("lastNameLowercase")
.orderBy("firstNameLowercase");
// how we get the query into the adapter
FirestoreRecyclerOptions<Client> options = new FirestoreRecyclerOptions.Builder<Client>()
.setQuery(query, Client.class)
.build();
// assign the adapter
adapter = new ClientAdapter(options);
RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
/**
* This section handles what happens when you swipe an item in the recyclerView list
*/
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) {
int position = viewHolder.getAdapterPosition();
adapter.deleteClient(position);
//adapter.notifyItemRemoved(position);
}
}).attachToRecyclerView(recyclerView);
/**
* This section handles what happens when you click on an item in the recyclerView list
*/
adapter.setOnItemClickListener(new ClientAdapter.OnItemClickListener() {
@Override
public void onItemClick(DocumentSnapshot documentSnapshot, int position) {
Client client = documentSnapshot.toObject(Client.class);
String id = documentSnapshot.getId();
Intent intentDisplayClient = new Intent(MainActivity.this, DisplayClientActivity.class);
// Pass ahead the client's id from Firestore to the next activity
intentDisplayClient.putExtra(KEY_ID, id);
startActivity(intentDisplayClient);
}
});
}

下面是适配器类:

public class ClientAdapter extends FirestoreRecyclerAdapter<Client, ClientAdapter.ClientHolder> {
private OnItemClickListener listener;
/**
* Create a new RecyclerView adapter that listens to a Firestore Query.
*/
public ClientAdapter(@NonNull FirestoreRecyclerOptions<Client> options) {
super(options);
}
@Override
protected void onBindViewHolder(@NonNull ClientHolder holder, int position, @NonNull Client model) {
String lastNameWithComma = model.getLastName() + ", ";
holder.textViewLastName.setText(lastNameWithComma);
holder.textViewFirstName.setText(model.getFirstName());
}
@NonNull
@Override
public ClientHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.client_list_item, parent, false);
return new ClientHolder(v);
}
public void deleteClient(int position) {
getSnapshots().getSnapshot(position).getReference().delete();
}
class ClientHolder extends RecyclerView.ViewHolder {
TextView textViewLastName;
TextView textViewFirstName;
public ClientHolder(@NonNull View itemView) {
super(itemView);
textViewLastName = itemView.findViewById(R.id.rv_tv_last_name);
textViewFirstName = itemView.findViewById(R.id.rv_tv_first_name);
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;
}
}

你会注意到在setUpRecyclerView((的onSwiped((函数中注释掉了一行。使用该行时,会发生其他不希望的行为:RecyclerView 确实"向上移动"较低的卡片以填补移除的卡片留下的空白,但位于 RecyclerView 底部的任何卡片都会被复制并放置在底部。所以如果它看起来像这样:

一个 B C D

。我滑动掉 C,然后它看起来像这样:

一个 B D D

所以我要么坚持列表根本没有更新,要么以一种没有意义的奇怪方式更新。

如果您有兴趣,我将按照本教程进行操作,但它不起作用:

https://www.youtube.com/watch?v=dTuhMFP-a1g&list=PLrnPJCHvNZuAXdWxOzsN5rgG2M4uJ8bH1&index=6&t=0s

如果您使用的是FirestoreRecyclerAdapter,则无需手动通知适配器。数据库中的更改将反映在 UI 中。因此,无需致电adapter.notifyItemRemoved(position).

此外,delete(...)是异步执行的。所以你需要添加一个回调来查看文档是否被删除成功:

public void deleteClient(int position) {
getSnapshots().getSnapshot(position).getReference().delete()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "DocumentSnapshot successfully deleted!");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "Error deleting document", e);
}
});
}

请参考这个。我用这个解决了我的问题。希望对您有所帮助。

你必须在 onStart(( 方法中编写它。 你也这样做了吗?

在查询查询中删除 .orderby,这对我有用。

最新更新