首页 > 解决方案 > RecyclerView 如何从 onCreateView 函数中获取项目计数(Android Studio)

问题描述

我正在我的项目中创建一个 RecyclerView。因此,在这种情况下,我使用 2 个数据库,Bookmark 和 Book。Book 存储书籍详细信息,例如标题、作者、出版商等。同时,Bookmark 存储(添加书签/收藏该书的用户的电子邮件)和书名。在我正在处理的这个页面上,我想显示登录用户之前收藏的所有书籍。所以,我从 SharedPreference 字符串中获取了用户的电子邮件,然后自然想在书签数据库中搜索包含该电子邮件的每一行,然后我想检索与每一行关联的书籍并通过这个 RecyclerView 显示它们在页面上。因此,我创建了一个名为 BookListNew 的新图书列表,这就是我想要显示的内容。

问题是,在调用 OnCreateView 函数之前,BookListNew 最初是空的,所以当我将 getItemCount() 设置为 BookListNew.size() 时,很明显它不会在页面上显示任何内容,并且如果我使用任何其他数组大小例如 BookList.size() 它超出了界限。

我知道这是问题所在,但我不知道如何解决。谁能帮我看看我的代码并建议我应该做什么?有什么办法可以从 OnCreateView 中获得最终计数?

这是代码:

package com.example.voluminous;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.example.voluminous.model.Book;
import com.example.voluminous.model.Bookmark;
import com.example.voluminous.sql.BookDatabaseHelper;
import com.example.voluminous.sql.BookmarkDatabaseHelper;
import com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.List;

public class BookmarkActivity extends AppCompatActivity {

    private RecyclerView rc;
    private ImageButton back;
    private BookDatabaseHelper BookDBHelper;
    private BookmarkDatabaseHelper BookmarkDBHelper;
    private String email;
    private String title;
    private int id;

    List<Book> BookList;
    List<Bookmark> BookmarkList;
    List<Book> BookListNew;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bookmark);

        back = (ImageButton) findViewById(R.id.ib_bookmark_back);
        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        BookDBHelper = new BookDatabaseHelper(this);
        BookmarkDBHelper = new BookmarkDatabaseHelper(this);
        rc = (RecyclerView) findViewById(R.id.rcbookmark);

        BookList = new ArrayList<>();
        BookList = BookDBHelper.getAllBook();

        BookmarkList = new ArrayList<>();
        BookmarkList = BookmarkDBHelper.getAllBookmark();

        BookListNew = new ArrayList<>();

        SharedPreferences sp = getSharedPreferences("user", MODE_PRIVATE);
        email = sp.getString("email","");
        for (int i = 0; i < BookmarkList.size(); i++)
        {
            Bookmark bookmark = BookmarkList.get(i);
            if (bookmark.getEmailAddress().equals(email))
            {
                for (int j = 0; j < BookList.size(); j++)
                {
                    Book book = BookList.get(i);
                    if (book.getTitle().equals(bookmark.getTitle()))
                    {
                        BookListNew.add(book);
                    }
                }
            }
        }

        int count = BookListNew.size();

        LinearLayoutManager gl = new LinearLayoutManager(this);
        rc.setLayoutManager(gl);
        int space = 20;
        rc.addItemDecoration(new SpacesItemDecoration(space));
        rc.setAdapter(new RecyclerAdapter());

    }

    class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

        @NonNull
        @Override
        public RecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.bookmark_list, parent, false);
            RecyclerAdapter.ViewHolder viewHolder = new RecyclerAdapter.ViewHolder(itemView);
            return viewHolder;
        }

        public void onBindViewHolder(@NonNull RecyclerAdapter.ViewHolder holder, @SuppressLint("RecyclerView") final int position) {
            holder.title.setText(BookListNew.get(position).getTitle());
            holder.author.setText(BookListNew.get(position).getAuthor());
            holder.publisher.setText(BookListNew.get(position).getPublisher());
            if(BookListNew.get(position).getCover() != null)
                Picasso.get().load(BookListNew.get(position).getCover()).into(holder.cover);
            holder.read.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(BookListNew.get(position).getLink()));
                    startActivity(browserIntent);
                }
            });
            holder.remove.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    title = BookList.get(position).getTitle();
                    for (int i = 0; i < BookmarkList.size(); i++)
                    {
                        Bookmark bookmark2 = BookmarkList.get(i);
                        if ((bookmark2.getEmailAddress().equals(email)) && (bookmark2.getTitle().equals(title)))
                        {
                            id = bookmark2.getId();
                            break;
                        }
                    }
                    Bookmark bookmarkToRemove = new Bookmark();
                    bookmarkToRemove.setId(id);
                    bookmarkToRemove.setTitle(title);
                    bookmarkToRemove.setEmailAddress(email);
                    BookmarkDBHelper.deleteBookmark(bookmarkToRemove);
                    notifyDataSetChanged();
                    Toast.makeText(BookmarkActivity.this, getResources().getString(R.string.success_bookmark_remove), Toast.LENGTH_SHORT).show();
                }
            });
            holder.container.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(BookmarkActivity.this, BookDetailsActivity.class);
                    intent.putExtra("bookTitle", BookListNew.get(position).getTitle());
                    startActivity(intent);
                }
            });
        }

        @Override
        public int getItemCount() {
            return BookListNew.size();
        }

        class ViewHolder extends RecyclerView.ViewHolder {
            private TextView title, author, publisher;
            private ImageButton remove;
            private ImageView cover;
            private Button read;
            private LinearLayout container;

            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                this.title = (TextView) itemView.findViewById(R.id.tv_bookmark_title);
                this.author = (TextView) itemView.findViewById(R.id.tv_bookmark_author);
                this.publisher = (TextView) itemView.findViewById(R.id.tv_bookmark_publisher);
                this.cover = (ImageView) itemView.findViewById(R.id.iv_bookmark_cover);
                this.remove = (ImageButton) itemView.findViewById(R.id.ib_bookmark_remove);
                this.read = (Button) itemView.findViewById(R.id.bt_bookmark_read);
                this.container = (LinearLayout) itemView.findViewById(R.id.ll_bookmark_container);
            }


        }

    }
    public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
        private int space;

        public SpacesItemDecoration(int space) {
            this.space = space;
        }

        @Override
        public void getItemOffsets(Rect outRect, View view,
                                   RecyclerView parent, RecyclerView.State state) {
            outRect.bottom = space;
            outRect.left = space;
            outRect.right = space;
            // Add top margin only for the first item to avoid double space between items
            if (parent.getChildPosition(view) == 0)
                outRect.top = space;
        }
    }
}

标签: javasqliteandroid-studioandroid-recyclerview

解决方案


推荐阅读