【发布时间】:2020-07-22 17:10:27
【问题描述】:
我正在关注 this 教程来实现 Room 数据库。一切都一样,除了我在一个片段上。没有错误,RecyclerView 卡片根本不可见。 (不使用RecyclerView 时我仍然可以动态添加卡片)
我已经在一个 Activity 上尝试过这个,但它仍然不起作用,所以我一定错过了一些东西,因为我没有从教程中复制整个代码。也许这很简单,因为我是 Android 新手。
适配器:
public class CartItemAdapter extends RecyclerView.Adapter<CartItemAdapter.CartItemHolder> {
private List<CartItem> cartItems = new ArrayList<>();
@NonNull
@Override
public CartItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.sample_product_item, parent, false);
return new CartItemHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull CartItemHolder holder, int position) {
CartItem currentCartItem = cartItems.get(position);
holder.tvItemName.setText(currentCartItem.getItemName());
holder.tvItemPrice.setText(currentCartItem.getItemPrice());
holder.tvQuantity.setText(String.valueOf(currentCartItem.getQuantity()));
}
@Override
public int getItemCount() {
return cartItems.size();
}
public void setCartItems(List<CartItem> cartItems) {
this.cartItems = cartItems;
notifyDataSetChanged();
}
class CartItemHolder extends RecyclerView.ViewHolder {
private TextView tvItemName;
private TextView tvItemPrice;
private TextView tvQuantity;
public CartItemHolder(@NonNull View itemView) {
super(itemView);
tvItemName = itemView.findViewById(R.id.itemName);
tvItemPrice = itemView.findViewById(R.id.itemPrice);
tvQuantity = itemView.findViewById(R.id.quantity);
}
}
}
视图模型:
public class CartItemViewModel extends AndroidViewModel {
private CartItemRepository repository;
private LiveData<List<CartItem>> allCartItems;
public CartItemViewModel(@NonNull Application application) {
super(application);
repository = new CartItemRepository(application);
allCartItems = repository.getAllCartItems();
}
public void insert(CartItem cartItem) {
repository.insert(cartItem);
}
public void update(CartItem cartItem) {
repository.update(cartItem);
}
public void delete(CartItem cartItem) {
repository.delete(cartItem);
}
public void deleteAllCartItems() {
repository.deleteAll();
}
public LiveData<List<CartItem>> getAllCartItems() {
return allCartItems;
}
}
片段布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:orientation="vertical">
<!--Views...-->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/cart_recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/totalCard"
android:layout_below="@id/titleCard"
android:padding="8dp"
tools:listitem="@layout/sample_product_item">
<!-- cart items dynamically added here -->
</androidx.recyclerview.widget.RecyclerView>
<!--Views...-->
</RelativeLayout>
片段类:
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.frag_cart, container, false);
RecyclerView recyclerView = view.findViewById(R.id.cart_recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setHasFixedSize(true);
final CartItemAdapter adapter = new CartItemAdapter();
recyclerView.setAdapter(adapter);
cartItemViewModel = new ViewModelProvider(getActivity(),
ViewModelProvider.AndroidViewModelFactory.getInstance(getActivity().getApplication())).get(CartItemViewModel.class);
cartItemViewModel.getAllCartItems().observe(getActivity(), new Observer<List<CartItem>>() {
@Override
public void onChanged(List<CartItem> cartItems) {
adapter.setCartItems(cartItems);
Log.i(TAG, "items set!");
}
});
return view;
}
我已经在CartItemDatabase中填充了数据库
@Database(entities = {CartItem.class}, version = 1)
public abstract class CartItemDatabase extends RoomDatabase {
private static CartItemDatabase instance;
public abstract CartItemDao cartItemDao();
public static synchronized CartItemDatabase getInstance(Context context) {
if (instance == null) {
instance = Room.databaseBuilder(context.getApplicationContext(),
CartItemDatabase.class, "cart_item_database")
.fallbackToDestructiveMigration()
.addCallback(roomCallback)
.build();
}
return instance;
}
private static RoomDatabase.Callback roomCallback = new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
new PopulateDbAsyncTask(instance).execute();
}
};
private static class PopulateDbAsyncTask extends AsyncTask<Void, Void, Void> {
private CartItemDao cartItemDao;
private PopulateDbAsyncTask(CartItemDatabase db) {
cartItemDao = db.cartItemDao();
}
@Override
protected Void doInBackground(Void... voids) {
cartItemDao.insert(new CartItem("Bread", "60", 2));
cartItemDao.insert(new CartItem("Butter", "70", 1));
return null;
}
}
}
我做错了什么? 请询问我是否需要更多信息。提前致谢。
【问题讨论】:
-
检查适配器中是否有物品
标签: java android android-fragments android-recyclerview android-room