簡體   English   中英

RecyclerView中的重復項

[英]Repeated Items in RecyclerView

我在RecyclerView中遇到重復項目時遇到問題。 每當我上傳到我的Firebase並再次打開main活動時,recyclerView中的重復主題便會重復之前的加載。 如何從我的recyclerView中刪除重復的物品。

我主要活動的代碼是

private RecyclerView mRecyclerView;
private RecyclerViewAdapter mAdapter;

private DatabaseReference mDatabaseReference;
private List<Upload> mUploads;

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

    mRecyclerView = findViewById(R.id.recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));



    mUploads = new ArrayList<>();


    mDatabaseReference = FirebaseDatabase.getInstance().getReference("uploads");

    mDatabaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot postSnapshot : dataSnapshot.getChildren())
            {
                Upload upload = postSnapshot.getValue(Upload.class);
                mUploads.add(upload);
            }
            mAdapter = new RecyclerViewAdapter(MainActivity.this, mUploads);
            mRecyclerView.setAdapter(mAdapter);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(MainActivity.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

    Button btn_post = (Button) findViewById(R.id.post_Main);
    btn_post.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent_posts = new Intent(MainActivity.this, Posts.class);
            startActivity(intent_posts);

        }
    });

}

來自我的Adapter類的代碼是

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.rViewHolder> {

private Context mContext;
private List<Upload> mUploads;

public RecyclerViewAdapter(Context context, List<Upload> uploads){
    mContext = context;
    mUploads = uploads;
}

@Override
public rViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.card_view_recycler_view, parent, false);
    return new rViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull rViewHolder viewHolder, int position) {
    Upload uploadCurrent = mUploads.get(position);
    viewHolder.textViewDescription.setText(uploadCurrent.getDescription());
    Picasso.get().load(uploadCurrent.getImageUrl()).into(viewHolder.imageView);

}

@Override
public int getItemCount() {
    return mUploads.size();
}


public class rViewHolder extends RecyclerView.ViewHolder{
    public TextView textViewDescription;
    public ImageView imageView;

    public  rViewHolder(View itemView){
        super(itemView);
        textViewDescription = itemView.findViewById(R.id.r_description);
        imageView = itemView.findViewById(R.id.r_image_view);
    }
}

我認為這是因為Firebase離線存儲數據,請嘗試以下方式初始化實例

FirebaseDatabase.getInstance().setPersistenceEnabled(false); 

應該管用。

嘗試清除列表,然后再向其中添加數據,如下所示。

private RecyclerView mRecyclerView;
private RecyclerViewAdapter mAdapter;

private DatabaseReference mDatabaseReference;
private List<Upload> mUploads;

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

    mRecyclerView = findViewById(R.id.recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));



    mUploads = new ArrayList<>();


    mDatabaseReference = FirebaseDatabase.getInstance().getReference("uploads");

    mDatabaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot postSnapshot : dataSnapshot.getChildren())
            {
                Upload upload = postSnapshot.getValue(Upload.class);
                mUploads.clear();
                mUploads.add(upload);
            }
            mAdapter = new RecyclerViewAdapter(MainActivity.this, mUploads);
            mRecyclerView.setAdapter(mAdapter);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(MainActivity.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

    Button btn_post = (Button) findViewById(R.id.post_Main);
    btn_post.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent_posts = new Intent(MainActivity.this, Posts.class);
            startActivity(intent_posts);

        }
    });

}

在這種情況下,請嘗試清除ArrayList,然后mUploads添加項目,例如mUploads

mDatabaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        // Clear ArrayList
        mUploads.clear();
        for(DataSnapshot postSnapshot : dataSnapshot.getChildren())
        {
            Upload upload = postSnapshot.getValue(Upload.class);
            mUploads.add(upload);
        }
        mAdapter = new RecyclerViewAdapter(MainActivity.this, mUploads);
        mRecyclerView.setAdapter(mAdapter);
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Toast.makeText(MainActivity.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();
    }
});

這對我來說效果很好,希望對您有所幫助。 參考這里。

如果您卸載應用程序並重新安裝,並且安裝后首次運行該應用程序時列表中有重復項,則后端Firebase中將存在重復項。 如果僅在您第二次運行該應用程序時存在重復項,則您的代碼負責。

您顯示的代碼對我來說看起來不錯。 可能還有其他一些您未顯示的錯誤,例如您有重復的addValueEventListener或使用List<Upload> mUploads

正如許多人建議您在此處執行mUploads.clear(); 不需要,因為您是從onCreate()填充數組的,所以女巫在Activity生命周期內僅運行一次

我將移動private List<Upload> mUploads; 如果未在其他地方使用onCreate()作為局部變量

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM