#java #android #firebase-realtime-database #staggeredgridlayout
#java #Android #firebase-realtime-database #staggeredgridlayout
Вопрос:
Я создал расположение сетки в шахматном порядке для загрузки изображений из Firebase, но оно не работает должным образом. Загрузил изображения с помощью picasso и использовал базу данных реального времени для чтения элементов… Не отображается ошибка в журнале cat, когда я использую журнал. По-прежнему отображается пустая страница как пустое действие
// private List<PostItem> postItems;
public static List<PostItem> postItems;
//////////////
private OnItemClickListener mListener;
public interface OnItemClickListener {
void onItemClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener) {
mListener = listener;
}
///////////////
public PostsAdapter(List<PostItem> postItems) {
PostsAdapter.postItems = postItems;
}
@NonNull
@Override
public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new PostViewHolder(
LayoutInflater.from(parent.getContext()).inflate(
R.layout.post_item_container,parent,false
)
);
}
@Override
public void onBindViewHolder(@NonNull PostViewHolder holder, int position) {
holder.setPostImage(postItems.get(position));
}
@Override
public int getItemCount() {
return postItems.size();
}
class PostViewHolder extends RecyclerView.ViewHolder{
RoundedImageView postImageView;
PostViewHolder(@NonNull View itemView) {
super(itemView);
postImageView = itemView.findViewById(R.id.imagePost);
///////
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mListener != null) {
int position = getAdapterPosition();
//if (position != RecyclerView.NO_POSITION) {
// mListener.onItemClick(position);
//}
}
});
///////
}
void setPostImage(PostItem postItem){
//load image here in picasso.
Picasso.get().load(postItem.getPit()).into(postImageView);
// postImageView.setImageResource(postItem.getImage());
}
}
}
Приведенный выше код, используемый в PostsAdapter.class
и есть также другой класс для PostItem.class
и приведенный ниже код используется для чтения данных и записи в массив списка — gallery.java
:
public class Gallery extends AppCompatActivity {
DatabaseReference databaseL;
PostItem postItem;
public static List<PostItem> postItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gallery);
//
databaseL = FirebaseDatabase.getInstance().getReference("galumon");
postItem = new PostItem();
final RecyclerView postRecyclerView = findViewById(R.id.postRecyclerview);
postRecyclerView.setLayoutManager(
new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL)
);
postItems = new ArrayList<>();
/*
List<PostItem> postItems = new ArrayList<>();
postItems.add(new PostItem(R.drawable.a));
postItems.add(new PostItem(R.drawable.b));
postItems.add(new PostItem(R.drawable.c));
postItems.add(new PostItem(R.drawable.d));
postItems.add(new PostItem(R.drawable.e));
postItems.add(new PostItem(R.drawable.f));
postItems.add(new PostItem(R.drawable.g));
postItems.add(new PostItem(R.drawable.h));
postItems.add(new PostItem(R.drawable.i));
*/
//
databaseL.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot ds : snapshot.getChildren()) {
postItem = ds.getValue(PostItem.class);
postItems.add(new PostItem(postItem.getPit()));
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
postRecyclerView.setAdapter(new PostsAdapter(postItems));
}
}
Комментарии:
1. Что именно в этом коде работает не так, как вы ожидаете?
Ответ №1:
Это потому, что вы сначала настраиваете адаптер на RecyclerView, а затем обновляете список.
Я предполагаю, что ранее это работало, когда вы вручную добавляли изображения в список и устанавливали адаптер (ссылаясь на прокомментированный код).
Попробуйте это:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gallery);
//
databaseL = FirebaseDatabase.getInstance().getReference("galumon");
postItem = new PostItem();
final RecyclerView postRecyclerView = findViewById(R.id.postRecyclerview);
postRecyclerView.setLayoutManager(
new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL)
);
postItems = new ArrayList<>();
//set the adapter
PostsAdapter postsAdapter = new PostsAdapter(postItems);
postRecyclerView.setAdapter(postsAdapter);
/*
List<PostItem> postItems = new ArrayList<>();
postItems.add(new PostItem(R.drawable.a));
postItems.add(new PostItem(R.drawable.b));
postItems.add(new PostItem(R.drawable.c));
postItems.add(new PostItem(R.drawable.d));
postItems.add(new PostItem(R.drawable.e));
postItems.add(new PostItem(R.drawable.f));
postItems.add(new PostItem(R.drawable.g));
postItems.add(new PostItem(R.drawable.h));
postItems.add(new PostItem(R.drawable.i));
*/
//
databaseL.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot ds : snapshot.getChildren()) {
postItem = ds.getValue(PostItem.class);
postItems.add(new PostItem(postItem.getPit()));
}
//notify the adapter
postsAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}