#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, — это все, поэтому вам нужно каждый раз вводить или очищать список.