【问题标题】:Rremoving Item from RecyclerView Causes Dublication of Items从 RecyclerView 中删除项目会导致项目重复
【发布时间】:2020-05-16 10:40:02
【问题描述】:

我是 android 的新手。我正在尝试制作一个人们可以相互共享图像的应用程序。(类似于 instagram)我正在为此使用 firebase 存储和存储。在 recyclerview 上添加新图像不是问题,当我长按它时我想删除该项目。但是在我的情况下,当我长按该项目时,不仅该项目被删除,而且其余项目也被复制。我在这里添加了一个示例图片。problem example 但是一旦我重新启动应用列表似乎没有任何重复。

这是我的提要屏幕代码;

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);


}

}

【问题讨论】:

    标签: java android-studio arraylist android-recyclerview


    【解决方案1】:

    试试这个:

    在您的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..........
                }
            })
    
     ..........
     ..........
    

    【讨论】:

    • 我仍然面临同样的问题。什么都没有改变。
    猜你喜欢
    • 2018-05-23
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多