Android: RecyclerView Показывает изображения 2 раза

#android #android-recyclerview #picasso

Вопрос:

мое приложение получает изображения из firebase в реальном времени, и я использую recyclerview для их отображения, но оно показывает изображения 2 раза, это означает, что если у меня есть 5 изображений на firebase, оно покажет те же 5 изображений, но дублирует их, что составляет 10 изображений.

мое приложение получает изображения с firebase-в реальном времени,

мой адаптер:

  @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.private_code_recycler_layout, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
 
        Picasso.get()
                .load(mImages.get(position))
                .placeholder(R.drawable.ic_baseline_cloud_download_24)
                .memoryPolicy(MemoryPolicy.NO_CACHE,MemoryPolicy.NO_STORE)
                .resize(480,480)
                .into(holder.image);


        holder.parentLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(mContext, FullScreenImageViewActivity.class);
                intent.putExtra("ImageURL", mImages.get(position));
                mContext.startActivity(intent);
            }
        });
    }
 

Активность:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityWorkDetailsBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        workUid_details = getIntent().getExtras().getString("UID_Details");
        String title = getIntent().getExtras().getString("name");
        String description = getIntent().getExtras().getString("description");
        String location = getIntent().getExtras().getString("location");
        String path = getIntent().getExtras().getString("path");

        databaseReference = FirebaseDatabase.getInstance().getReference().child("Work").child(path);
        valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                binding.workDetailsTitle.setText(title);
                binding.workDetailsDescription.setText(description);
                binding.workDetailsLocation.setText(location);
                binding.getUIDDetails.setText(workUid_details);

                for (DataSnapshot dataSnapshot : snapshot.child("images").getChildren()) {
                    String value = String.valueOf(dataSnapshot.child("image").getValue());
                    imagesFromURL.add(value);
                }
                initRecyclerView();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) { }
        };

    }

    private void initRecyclerView(){
        binding.workDetailsImage.setNestedScrollingEnabled(false);
        binding.workDetailsImage.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
        binding.workDetailsImage.setHasFixedSize(true);
        WorkDetailsAdapter adapter = new WorkDetailsAdapter(this, imagesFromURL);
        binding.workDetailsImage.setAdapter(adapter);
        binding.progressBar.setVisibility(View.VISIBLE);
    }
 

Комментарии:

1. Я думаю, что вам также следует добавить тег «java» сейчас? Рекомендуемый язык сейчас-Котлин, поэтому многие люди также используют его. Просто чтобы избежать путаницы (необязательно переходить на Kotlin, Java просто прекрасна. Котлин просто проще писать)

Ответ №1:

добавьте imagesFromURL.clear(); , прежде чем добавлять ImageUrl.

 imagesFromURL.clear();//add this line
for (DataSnapshot dataSnapshot : snapshot.child("images").getChildren()) {
    String value = String.valueOf(dataSnapshot.child("image").getValue());
    imagesFromURL.add(value);
}
 

Комментарии:

1. это сработало, спасибо, не могли бы вы объяснить мне, в чем была причина?

2. @Mini Данные, которые вы получаете от firebase, — это все, поэтому вам нужно каждый раз вводить или очищать список.