RecyclerView заполняет данные после второго вызова startActivity - PullRequest
1 голос
/ 27 мая 2020

У меня есть представление ресайклера, которое загружает данные из адаптера. Адаптер получает данные из 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 или адаптере?

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

вы сначала запускаете recycelerView с пустым adpater, затем вызываете initCollection() и устанавливаете данные для адаптера, поэтому попробуйте следующее:

    @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 = new RecyclerViewAdapter(MainActivity.this, mAuthor, mImageUrls,  mBookName);
    mAdapter.notifyDataSetChanged();
    }
    private void initRecyclerView(){
        Log.d(TAG, "initRecyclerView: init recyclerview.");
        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
        recyclerView.setAdapter(mAdapter);
    }

    @Override
    protected void onStart() {
        super.onStart();

    }
}
0 голосов
/ 27 мая 2020

Удалите эту строку из onStart() и onCreate() и в конце initCollection():

initRecyclerView();

И вызовите ее в onDataChange() после выполнения for l oop:

    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();

            //call it here only

            initRecyclerView();


        }
        .............
        .............

ОБНОВЛЕНИЕ:

Удалите эту строку из initCollection() метода:

mAdapter.notifyDataSetChanged();
...