简体   繁体   English

图像未显示在Firebase RecyclerView中

[英]Image Not Displaying in firebase RecyclerView

I'm trying to display images from the firebase database. 我正在尝试显示Firebase数据库中的图像。 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. 我认为在Firebase中一切都很好,但是什么也没显示。它没有在布局中显示图像,我为recyclerview和item_view.xml创建了main_layout这是我的代码。

MainActivity.java 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 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 Upload.java

<i>

public class Upload { private String mImageUrl; 公共类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; E / RecyclerView:未连接适配器; skipping layout 跳过布局

You are not setting an adapter for your recyclerView and you are not updating it after you receive datas from Firebase. 您没有为recyclerView设置适配器,并且从Firebase接收数据后也没有更新适配器。 I would solve this in the following way. 我将通过以下方式解决此问题。 First of all, add a setter in your adapter: 首先,在适配器中添加一个setter:

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: 然后,在您的活动中,如下更改onCreate方法:

@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. 这样,您将从一个空列表开始,因此您的recyclerView将什么也不显示。 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 然后,当您接收到数据时,您只需对其进行更新,就可以在适配器中设置数据集并通知适配器某些更改,因此必须重新绘制列表

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM