java - 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;
}
}
}
解决方案
推荐阅读
- database - 为什么 Prometheus 不适合长期存储?
- html - rxweb 根据 Angular 中的 formArray 验证重复输入
- raster - 导入后 QGIS 会更改栅格的颜色
- jquery - 动态添加具有动态子输入字段的输入字段组
- postgresql - pgloader 中 SQL 加载器的 'WHEN' 等价物
- c# - Jquery datatables 在我的应用程序中不起作用,我似乎无法找出问题所在
- m2doc - 如何自动化 M2Doc 生成,包括设置?
- swift - Firebase 数据 Swift
- python - Selenium Python Paste 在无头模式下不起作用
- .net - dotnet 发布是否忽略了 csproj 运行时?