У меня есть представление ресайклера, которое загружает данные из адаптера. Адаптер получает данные из Arraylist, заполненного базой данных Firebase. Данные не отображаются, когда я запускаю приложение. Однако, если я заблокирую свой экран, а затем разблокирую его снова, вид ресайклера будет хорошо заполнен. Мне что-то не хватает в моем RecyclerView или адаптере?
Вот мой код активности
public class MainActivity extends AppCompatActivity {
DatabaseReference homepageRef;
RecyclerViewAdapter mAdapter;
private static final String TAG = "MainActivity";
//vars
private ArrayList<String> mAuthor = new ArrayList<>();
private ArrayList<String> mImageUrls = new ArrayList<>();
private ArrayList<String> mBookName = new ArrayList<>();
List<Book> bookList;
RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "onCreate: started.");
//initializing the productlist
bookList = new ArrayList<>();
initRecyclerView();
initCollection();
}
private void initCollection(){
Log.d(TAG, "initImageBitmaps: preparing bitmaps.");
homepageRef=FirebaseDatabase.getInstance().getReference("collections/homepage");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String author = ds.child("author").getValue(String.class);
mAuthor.add(author);
String title = ds.child("title").getValue(String.class);
mBookName.add(title);
String thumbnail = ds.child("thumbnail").getValue(String.class);
mImageUrls.add(thumbnail);
Log.d("TAG", author + title);
}
long numOfBooks=dataSnapshot.getChildrenCount();
Log.d(TAG, "Value is: " + numOfBooks);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toast.makeText(MainActivity.this, "Error fetching data", Toast.LENGTH_LONG).show();
}
};
homepageRef.addValueEventListener(eventListener);
mAdapter.notifyDataSetChanged();
initRecyclerView();
}
private void initRecyclerView(){
Log.d(TAG, "initRecyclerView: init recyclerview.");
RecyclerView recyclerView = findViewById(R.id.recycler_view);
mAdapter = new RecyclerViewAdapter(MainActivity.this, mAuthor, mImageUrls, mBookName);
recyclerView.setAdapter(mAdapter);
recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
}
@Override
protected void onStart() {
super.onStart();
initRecyclerView();
}
}
Я создаю адаптер здесь
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{
private static final String TAG = "RecyclerViewAdapter";
private ArrayList<String> mAuthor = new ArrayList<>();
private ArrayList<String> mImages = new ArrayList<>();
private ArrayList<String> mBookName = new ArrayList<>();
private Context mContext;
public RecyclerViewAdapter(Context context, ArrayList<String> author, ArrayList<String> images, ArrayList<String> bookName ) {
mContext = context;
mAuthor = author;
mImages = images;
mBookName = bookName;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview_item_book, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
Log.d(TAG, "onBindViewHolder: called.");
Glide.with(mContext)
.asBitmap()
.load(mImages.get(position))
.into(holder.image);
holder.imageName.setText(mAuthor.get(position));
holder.parentLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.d(TAG, "onClick: clicked on: " + mAuthor.get(position));
Toast.makeText(mContext, mAuthor.get(position), Toast.LENGTH_SHORT).show();
/*
Intent intent = new Intent(mContext, ReadingActivity.class);
intent.putExtra("image_url", mImages.get(position));
intent.putExtra("image_name", mImageNames.get(position));
mContext.startActivity(intent);*/
//create a Bundle object
Bundle extras = new Bundle();
//Adding key value pairs to this bundle
//there are quite a lot data types you can store in a bundle
extras.putString("BOOK_NAME",mBookName.get(position));
extras.putInt("PAGE_NUMBER", 1);
Intent intent = new Intent(mContext,BookDescriptionActivity.class);
intent.putExtras(extras);
mContext.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return mAuthor.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
ImageView image;
TextView imageName;
RelativeLayout parentLayout;
public ViewHolder(View itemView) {
super(itemView);
image = itemView.findViewById(R.id.thumbnail);
imageName = itemView.findViewById(R.id.author);
parentLayout = itemView.findViewById(R.id.parent_id);
}
}
}
Данные не отображаются когда я запускаю приложение. Однако, если я заблокирую свой экран, а затем разблокирую его снова, вид ресайклера будет хорошо заполнен. Мне что-то не хватает в моем RecyclerView или адаптере?