CodeRED Innovations
CodeRED Innovations

Reputation: 298

recycler view shows empty instead of showing images?

I don't know what makes this but no image is showing any images. Please help me to rectify the issue.

My Adapter class:

public class Images_Adapter extends RecyclerView.Adapter<Images_Adapter.ViewHolder> {

    private List<Images_Item> items;
    private int itemLayout;

    public Images_Adapter(List<Images_Item> items, int itemLayout) {
        this.items = items;
        this.itemLayout = itemLayout;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(itemLayout, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Images_Item item = items.get(position);

        Glide.with(holder.image.getContext())
                .load(item.getImageURL())
                .into(holder.image);
    }

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

    static class ViewHolder extends RecyclerView.ViewHolder {
        ImageView image;

        ViewHolder(View itemView) {
            super(itemView);
            image = itemView.findViewById(R.id.ImageItem);
        }
    }
}

My Images_Item Class:

class Images_Item {

    private String imageURL;

    String getImageURL() {
        return imageURL;
    }

    Images_Item(String string) {
    }
}

My Activity Class:

public class Events_and_Participations extends AppCompatActivity {

    StorageReference reference;
    RecyclerView recyclerView;
    Images_Adapter adapter;
    FirebaseAuth auth;
    Button button;
    FirebaseUser user;
    List<Images_Item> items = new ArrayList<>();

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

        user = FirebaseAuth.getInstance().getCurrentUser();

        reference = FirebaseStorage.getInstance().getReference("images");


        if (user != null){
            reference.listAll()
                    .addOnSuccessListener(listResult -> {
                        for (StorageReference item : listResult.getItems()) {
                            item.getDownloadUrl().addOnCompleteListener(task -> {
                                items.add(new Images_Item(task.getResult().toString()));
                            });
                        }
                    })
                    .addOnFailureListener(e -> Toast.makeText(Events_and_Participations.this, e.getMessage(), Toast.LENGTH_SHORT).show());
        }



        adapter = new Images_Adapter(items, R.layout.item_events_image);
        recyclerView = findViewById(R.id.events_photos);
        recyclerView.setAdapter(adapter);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setItemAnimator(new DefaultItemAnimator());
    }
}

It just shows an empty screen even it throws no errors. I'm getting the links properly but it won't shows the images. No Log cat shows and no images are displayed.

Upvotes: 1

Views: 171

Answers (3)

mojtaba joshaghani
mojtaba joshaghani

Reputation: 71

you didnt set imageUrl:

class Images_Item {

private String imageURL;

String getImageURL() {
    return imageURL;
}

Images_Item(String string) {
   this.imageURL = string;
}

Upvotes: 0

Zain
Zain

Reputation: 40830

A couple of issues that you can work on:

First, you didn't add a valid layout path in onCreateViewHolder, which should include R.layout.xx, replace xx with your item layout name.

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

Second, your Firebase items take time until they are received as it works in a background thread, so you need to do something like adapter.notifiyDataSetChanged() upon receiving the items, or set the adapter instead

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

    user = FirebaseAuth.getInstance().getCurrentUser();

    reference = FirebaseStorage.getInstance().getReference("images");

    recyclerView = findViewById(R.id.events_photos);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setItemAnimator(new DefaultItemAnimator());

    if (user != null){
        reference.listAll()
                .addOnSuccessListener(listResult -> {
                    for (StorageReference item : listResult.getItems()) {
                        item.getDownloadUrl().addOnCompleteListener(task -> {
                            items.add(new Images_Item(task.getResult().toString()));
                        });
                    }

                    adapter = new Images_Adapter(items, R.layout.item_events_image);
                    recyclerView.setAdapter(adapter);

                })
                .addOnFailureListener(e -> Toast.makeText(Events_and_Participations.this, e.getMessage(), Toast.LENGTH_SHORT).show());


    }

}

Finally, you didn't set the imageURL attribute in the construcotr with the images URLs, so do that in the constructor.

class Images_Item {

    private String imageURL;

    String getImageURL() {
        return imageURL;
    }

    Images_Item(String string) {
        imageURL = string; //<<<<<<<<<<<<< here is the change
    }
}

Upvotes: 1

denniz crypto
denniz crypto

Reputation: 471

ImageUrl is never initialized hence it is always null.

class Images_Item {

private String imageURL;

String getImageURL() {
    return imageURL;
}

Images_Item(String string) {
   this.imageURL = string;
}

}

Upvotes: 2

Related Questions