Повторяющиеся элементы в RecyclerView - PullRequest
0 голосов
/ 08 декабря 2018

У меня проблемы с повторяющимися элементами в 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);

        }
    });

}

Код из моего класса адаптеров:

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

Ответы [ 4 ]

0 голосов
/ 29 мая 2019

Если вы удаляете приложение и устанавливаете его снова, и в первый раз после запуска приложения после установки в списке появляются повторяющиеся элементы, то в бэкэнд-базе Firebase есть дублирующиеся элементы.Если есть повторяющиеся элементы только во второй раз, когда вы запускаете приложение, то ваш код несет ответственность.

Код, который вы показали, выглядит хорошо для меня.Должно быть что-то еще, что вы не показываете, например, что у вас есть дубликат addValueEventListener, или вы подаете адаптер повторно с List<Upload> mUploads

Как многие предполагают, что вы делаете mUploads.clear();,не требуется, так как вы заполняете массив из onCreate(), ведь только один раз он запускается во время Activity lifecykle

Я бы переместил private List<Upload> mUploads; в onCreate() как локальную переменную, если вы не используете его в другом месте

0 голосов
/ 08 декабря 2018

Попробуйте очистить свой список перед добавлением к нему данных, как показано ниже.

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

        }
    });

}
0 голосов
/ 29 мая 2019

Попробуйте очистить свой ArrayList в этом случае 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();
    }
});

Это хорошо работает с моей стороны, и я надеюсь, что это поможет. Ссылка здесь.

0 голосов
/ 08 декабря 2018

Я думаю, это происходит из-за того, что Firebase хранит данные в автономном режиме, попробуйте ниже способ инициализации экземпляра

FirebaseDatabase.getInstance().setPersistenceEnabled(false); 

должно работать.

...