Nabin Rai
Nabin Rai

Reputation: 3

Image Not Displaying in firebase RecyclerView

I'm trying to display images from the firebase database. I think in firebase everything good but didn't show anything.IT didn't showing images in layout, I created main_layout for recyclerview and item_view.xml Here's my code.

MainActivity.java

<i>public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private ImageAdapter mAdapter;


private DatabaseReference mDatabaseRef;
private List<Upload> mUploads;

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

    mRecyclerView = findViewById(R.id.recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));

    mUploads = new ArrayList<>();

    mDatabaseRef = FirebaseDatabase.getInstance().getReference("Data");

    mDatabaseRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                Upload upload = postSnapshot.getValue(Upload.class);
                mUploads.add(upload);
            }

            mAdapter = new ImageAdapter(MainActivity.this, mUploads);


        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(MainActivity.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

}

ImageAdapter.java

<i>public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageViewHolder> {
private Context mContext;
private List<Upload> mUploads;

public ImageAdapter(Context context, List<Upload> uploads) {
    mContext = context;
    mUploads = uploads;
}

@Override
public ImageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(mContext).inflate(R.layout.item_view, parent, false);
    return new ImageViewHolder(v);
}

@Override
public void onBindViewHolder(ImageViewHolder holder, int position) {
    Upload uploadCurrent = mUploads.get(position);
    picasso.get()
            .load(uploadCurrent.getImageUrl())
            .placeholder(R.mipmap.ic_launcher)
            .fit()
            .centerCrop()
            .into(holder.imageView);
}

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

public class ImageViewHolder extends RecyclerView.ViewHolder {
    public ImageView imageView;

    public ImageViewHolder(View itemView) {
        super(itemView);

        imageView = itemView.findViewById(R.id.image_view);
    }
}
Picasso.Builder picassoBuilder = new Picasso.Builder(mContext);
Picasso picasso = picassoBuilder.build();

}

Upload.java

<i>

public class Upload { private String mImageUrl;

public Upload() {

}

public Upload( String imageUrl) {
    mImageUrl = imageUrl;
}

public String getImageUrl() {
    return mImageUrl;
}

public void setImageUrl(String imageUrl) {
    mImageUrl = imageUrl;
}

}

DEBUG OUTPUT:

E/RecyclerView: No adapter attached; skipping layout

Upvotes: 0

Views: 646

Answers (1)

Gregorio Palam&#224;
Gregorio Palam&#224;

Reputation: 1952

You are not setting an adapter for your recyclerView and you are not updating it after you receive datas from Firebase. I would solve this in the following way. First of all, add a setter in your adapter:

public void setUploads(List<Upload> uploads) {
    this.mUploads = uploads;
    this.notifyDataSetChanged();
}

This will allow you do modify the dataset of your adapter easily. Then, in your activity, change the onCreate method as follow:

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

    mRecyclerView = findViewById(R.id.recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));

    mAdapter = new ImageAdapter(MainActivity.this, new ArrayList<>());
    mRecyclerView.setAdapter(mAdapter);

    mDatabaseRef = FirebaseDatabase.getInstance().getReference("Data");

    mDatabaseRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            List<Upload> readUploads = new ArrayList<>();
            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                Upload upload = postSnapshot.getValue(Upload.class);
                readUploads.add(upload);
            }
            mAdapter.setUploads(readUploads);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(MainActivity.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

In this way, you're starting with an empty list, so your recyclerView will show nothing. Then, when you receive your data, you're simply updating it, setting the dataset in your adapter and notifying the adapter that something has changed, so it has to re-draw the list

Upvotes: 1

Related Questions