java - 从 RecyclerView 中删除项目会导致项目重复
问题描述
我是android的新手。我正在尝试制作一个人们可以相互共享图像的应用程序。(类似于 instagram)我正在为此使用 firebase 存储和存储。在 recyclerview 上添加新图像不是问题,当我长按它时我想删除该项目。但在我的情况下,当我长按该项目时,不仅该项目被删除,而且其余项目也被复制。我在这里添加了一张示例图片。问题示例 但是,一旦我重新启动应用程序列表,它看起来就很好,没有任何重复。
这是我的提要屏幕代码;
public class FeedActivity extends AppCompatActivity implements FeedRecyclerAdapter.OnNoteListener {
private FirebaseAuth firebaseAuth;
private FirebaseFirestore firebaseFirestore;
private FirebaseStorage firebaseStorage;
private StorageReference storageReference;
ArrayList<String> userEmailFromFB;
ArrayList<String> usercommentFromFB;
ArrayList<String> userImageFromFB;
FeedRecyclerAdapter feedRecyclerAdapter;
ArrayList<String> dokumanl;
ArrayList<String> namel;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater=getMenuInflater();
menuInflater.inflate(R.menu.insta_options_menu,menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId()== R.id.add_post){
Intent intentToUpload=new Intent(FeedActivity.this, UploadActivity.class);
startActivity(intentToUpload);
}else if (item.getItemId()==R.id.signout){
firebaseAuth.signOut();
Intent intentToSignUp=new Intent(FeedActivity.this,SignUpActivity.class);
startActivity(intentToSignUp);
finish();
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_feed);
usercommentFromFB=new ArrayList<>();
userEmailFromFB=new ArrayList<>();
userImageFromFB=new ArrayList<>();
dokumanl =new ArrayList<>();
namel=new ArrayList<>();
firebaseStorage = FirebaseStorage.getInstance();
storageReference= firebaseStorage.getReference();
firebaseAuth=FirebaseAuth.getInstance();
firebaseFirestore=FirebaseFirestore.getInstance();
RecyclerView recyclerView=findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
feedRecyclerAdapter= new FeedRecyclerAdapter(userEmailFromFB,usercommentFromFB,userImageFromFB, this);
recyclerView.setAdapter(feedRecyclerAdapter);
getDataFromFirestore();
}
public void getDataFromFirestore(){
CollectionReference collectionReference=firebaseFirestore.collection("Posts");
collectionReference.orderBy("date", Query.Direction.DESCENDING).addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
if (e != null){
Toast.makeText(FeedActivity.this, e.getLocalizedMessage().toString(), Toast.LENGTH_LONG).show();
}
if( queryDocumentSnapshots != null){
for( DocumentSnapshot snapshot: queryDocumentSnapshots.getDocuments()){
Map<String,Object> data= snapshot.getData();
String comment= (String)data.get("comment");
String userEmail=(String)data.get("useremail");
String downloadUrl= (String)data.get("downloadurl");
String dokuman= snapshot.getId();
String name= (String)data.get("name");
usercommentFromFB.add(comment);
userEmailFromFB.add(userEmail);
userImageFromFB.add(downloadUrl);
dokumanl.add(dokuman);
namel.add(name);
feedRecyclerAdapter.notifyDataSetChanged();
}
}
}
});
}
@Override
public void onNoteClick(int position) {
//System.out.println("position:"+ namel.get(position));
StorageReference desertRef= storageReference.child(namel.get(position));
desertRef.delete();
firebaseFirestore.collection("Posts").document(dokumanl.get(position))
.delete()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(FeedActivity.this, "Silindi", Toast.LENGTH_LONG).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
usercommentFromFB.remove(position);
userImageFromFB.remove(position);
userEmailFromFB.remove(position);
dokumanl.remove(position);
namel.remove(position);
feedRecyclerAdapter.notifyDataSetChanged();
}
}
这也是我的适配器代码;
public class FeedRecyclerAdapter extends RecyclerView.Adapter<FeedRecyclerAdapter.PostHolder> {
private ArrayList<String> userEmailList;
private ArrayList<String> userCommentList;
private ArrayList<String> userImageList;
private OnNoteListener mOnNoteListener;
public FeedRecyclerAdapter(ArrayList<String> userEmailList, ArrayList<String> userCommentList, ArrayList<String> userImageList, OnNoteListener onNoteListener) {
this.userEmailList = userEmailList;
this.userCommentList = userCommentList;
this.userImageList = userImageList;
this.mOnNoteListener= onNoteListener;
}
@NonNull
@Override
public PostHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater layoutInflater=LayoutInflater.from(parent.getContext());
View view=layoutInflater.inflate(R.layout.recycler_row,parent,false);
return new PostHolder(view, mOnNoteListener);
}
@Override
public void onBindViewHolder(@NonNull PostHolder holder, int position) {
holder.userEmailText.setText(userEmailList.get(position));
holder.commentText.setText(userCommentList.get(position));
Picasso.get().load(userImageList.get(position)).into(holder.imageView);
}
@Override
public int getItemCount() {
return userEmailList.size();
}
class PostHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener {
ImageView imageView;
TextView userEmailText;
TextView commentText;
OnNoteListener onNoteListener;
public PostHolder(@NonNull View itemView, OnNoteListener onNoteListener) {
super(itemView);
imageView=itemView.findViewById(R.id.recyclerView_row_imageview);
userEmailText=itemView.findViewById(R.id.recyclerView_row_useremail_text);
commentText=itemView.findViewById(R.id.recyclerView_row_comment_text);
this.onNoteListener=onNoteListener;
itemView.setOnLongClickListener(this);
}
@Override
public boolean onLongClick(View v) {
onNoteListener.onNoteClick(getAdapterPosition());
return false;
}
}
public interface OnNoteListener{
void onNoteClick(int position);
}
}
解决方案
尝试这个:
在您的onNoteClick(int position)
方法中FeedActivity
:
移动这些行:
usercommentFromFB.remove(position);
userImageFromFB.remove(position);
userEmailFromFB.remove(position);
dokumanl.remove(position);
namel.remove(position);
feedRecyclerAdapter.notifyDataSetChanged();
直接在addOnSuccessListener
:
........
........
firebaseFirestore.collection("Posts").document(dokumanl.get(position))
.delete()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(FeedActivity.this, "Silindi", Toast.LENGTH_LONG).show();
//here..........
}
})
..........
..........
推荐阅读
- webpack - ./src/index.js 中的错误模块构建失败(来自 ./node_modules/babel-loader/lib/index.js):TypeError:无法读取 null 的属性“绑定”
- python-3.x - 无法在 GCP jupyterlab 笔记本中解压缩文件:“未找到中央目录结尾签名。”
- flutter - 富文本中 TextSpan 的可滚动位置
- pytorch - Yolov3 - 连接输出层以加速训练
- c# - 为什么在引用对象完成移动后,带有脚本的对象开始向右移动?
- spring - springjdbc模板不返回表的别名列名
- python-3.x - 将 .TIF 转换为 .PDF 会产生 PIL:读取图像时出错
- javascript - 创建目录选择器以使用 js 将文件下载到客户端计算机
- android - 在应用程序中,如何在不丢失连接的情况下在接入点之间切换?
- php - 如何在archive.php 中显示自定义帖子类型?