Firebase - RecyclerView показывает только одно изображение несколько раз - PullRequest
0 голосов
/ 07 декабря 2018

Это мой класс java

private String locations;
private String images;

public ItemData(){

}

public ItemData(String locations, String images){

    this.locations = locations;
    this.images = images;

}

public String getLocations() {
    return locations;
}

public void setLocations(String locations) {
    this.locations = locations;
}

public String getImages() {
    return images;
}

public void setImages(String images) {
    this.images = images;
   }

}

Это основное занятие, где я получаю снимки данных с firebase.

    itemData = new ItemData();
    rv = findViewById(R.id.recycler);
    rv.setLayoutManager(new LinearLayoutManager(this));
    data = new ArrayList<>();


    adapter = new RecyclerAdapter(data);
    rv.setAdapter(adapter);

}

@Override
protected void onStart() {
    super.onStart();

    imageRef = database.getInstance().getReference("Users").child(userid).child("images");

    imageRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot mData : dataSnapshot.getChildren()) {

                String mImages = mData.getValue(String.class);
                itemData.setImages(mImages);

                data.add(itemData);

            }

            adapter.notifyDataSetChanged();

        }

Я пытаюсь показать сохраненные изображенияв ключе «изображения»: например, urlImages1, urlImages2, urlImages3.Но при запуске приложения отображается только одно и то же изображение размером recyclerview.Очень благодарен за вашу помощь

РЕДАКТИРОВАТЬ:

public class RecyclerAdapter  extends RecyclerView.Adapter<RecyclerAdapter.ItemDataViewHolder>{

List<ItemData> data;


public RecyclerAdapter(List<ItemData> data) {
    this.data = data;
}

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


}

@Override
public void onBindViewHolder(@NonNull ItemDataViewHolder holder, int position) {

    ItemData itemData = data.get(position);
    holder.location.setText(itemData.getLocations());

    Picasso.get().load(itemData.getImages())
            .rotate(270).into(holder.imageView);

}

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


public static class ItemDataViewHolder extends RecyclerView.ViewHolder{

ImageView imageView;
TextView title, location;
public ItemDataViewHolder(View itemView) {
    super(itemView);

    imageView = itemView.findViewById(R.id.rImageView);
    title = itemView.findViewById(R.id.rTitleTv);
    location = itemView.findViewById(R.id.rDescriptionTv);
}
}

}

ОБНОВЛЕНИЕ: Я хочу показать данные "изображения" и "местоположения" в адаптере.Как получить ссылку на два ключа в одном и том же списке событий?

«Пользователи»: {

"X7aVfZH5oZbIaeyLm9FAjOSr5Gd2" : {
  "images" : {
    "urlImages1" : "https://firebasestorage.googleapis.com/v0/b/anthiefy.appspot.com/o/X7aVfZH5oZbIaeyLm9FAjOSr5Gd2%2FImages%2FImg1.jpg?alt=media&token=e26fd6a2-2be7-4a01-920e-0aed1fe06436",
    "urlImages2" : "https://firebasestorage.googleapis.com/v0/b/anthiefy.appspot.com/o/X7aVfZH5oZbIaeyLm9FAjOSr5Gd2%2FImages%2FImg2.jpg?alt=media&token=40165918-3b46-4b22-b0ef-255965b7855d",
    "urlImages3" : "https://firebasestorage.googleapis.com/v0/b/anthiefy.appspot.com/o/X7aVfZH5oZbIaeyLm9FAjOSr5Gd2%2FImages%2FImg3.jpg?alt=media&token=cfd7d00d-9b1a-44fd-80d4-a2947f7de743",
    "urlImages4" : "https://firebasestorage.googleapis.com/v0/b/anthiefy.appspot.com/o/X7aVfZH5oZbIaeyLm9FAjOSr5Gd2%2FImages%2FImg4.jpg?alt=media&token=995419a7-70f7-4330-b046-d06a4d54453e",
    "urlImages6" : "https://firebasestorage.googleapis.com/v0/b/anthiefy.appspot.com/o/X7aVfZH5oZbIaeyLm9FAjOSr5Gd2%2FImages%2FImg6.jpg?alt=media&token=ee6f566a-a9e5-4e8f-9d53-64d3f3bc97a6",
    "urlImages7" : "https://firebasestorage.googleapis.com/v0/b/anthiefy.appspot.com/o/X7aVfZH5oZbIaeyLm9FAjOSr5Gd2%2FImages%2FImg7.jpg?alt=media&token=883a3321-fbba-49bd-aae3-14b005b4cc5b"
  },
  "locations" : {
    "locations1" : "14.2830817 -89.7263953",
    "locations2" : "14.2661424 -89.7220017",
    "locations3" : "14.2846352 -89.7251991",
    "locations4" : "14.2684987 -89.7266704",
    "locations5" : "14.2684987 -89.7266704",
    "locations6" : "14.2684987 -89.7266704",
    "locations7" : "14.2684987 -89.7266704"

1 Ответ

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

Здравствуйте, внесите следующие изменения, это должно работать нормально.

 imageRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot mData : dataSnapshot.getChildren()) {

                String mImages = mData.getValue(String.class);
               ItemData itemDataOne = new ItemData();
                itemDataOne .setImages(mImages);

                data.add(itemDataOne );

            }

            adapter.notifyDataSetChanged();

        }

Объяснение: проблема заключалась в том, что вы создавали ItemData только один раз и устанавливали его в цикле.В Java объект (ItemData) имеет тип passByReference, поэтому, когда вы добавляете его в список, добавляется ссылка, и поскольку был создан только один объект, добавлялась та же ссылка, и значение было установлено для последних данных.

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