Изображение не отображается в FireBase RecyclerView - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь отобразить изображения из базы данных Firebase. Я думаю, что в Firebase все хорошо, но ничего не показывалось. В макете не отображались изображения, я создал main_layout для recyclerview и item_view.xml Вот мой код.

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>

публичный класс Upload { приватная строка mImageUrl;

public Upload() {

}

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

public String getImageUrl() {
    return mImageUrl;
}

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

} * * тысяча двадцать-один

ВЫХОД ОТЛАДКИ:

E / RecyclerView: адаптер не подключен; пропускающий макет

1 Ответ

0 голосов
/ 04 января 2019

Вы не устанавливаете адаптер для вашего recyclerView и не обновляете его после получения данных от Firebase. Я бы решил это следующим образом. Прежде всего, добавьте сеттер в свой адаптер:

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

Это позволит вам легко изменять набор данных вашего адаптера. Затем в своей деятельности измените метод 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();
        }
    });
}

Таким образом, вы начинаете с пустого списка, поэтому в вашем обзоре реселлера ничего не будет отображаться. Затем, когда вы получаете ваши данные, вы просто обновляете их, устанавливаете набор данных в своем адаптере и уведомляете адаптер, что что-то изменилось, поэтому он должен заново нарисовать список

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