[英]RecyclerView isn't visible on Fragment
我正在按照本教程來實現 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>
片段 class:
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;
}
}
}
我究竟做錯了什么? 請詢問我是否需要更多信息。 提前致謝。
建議
學習調試代碼並查明錯誤。 我得到的大多數錯誤都是通過調試來解決的。 如果您不知道調試是什么或如何進行,您可以 google 一下。 這真的很簡單,它可以為您節省數小時的問題解決時間,並且可以完全節省您的問題。
我建議這樣做是因為根據您的描述,我首先要檢查的是我的 RecyclerView 是否收到任何東西。 我會通過在我的 RecyclerView 的getItemCount
方法中設置一個調試斷點來做到這一點。 如果返回的值大於 0,則表示沒關系。
然后我會繼續檢查我的代碼的其他步驟,這樣你就可以真正看到哪里出了問題,這對於更好地了解正在發生的事情以及事情是如何工作的非常有用。
通過這種方式,您可以查明您的錯誤並提出更具體的問題。 您可以只引用一個方法或一行,而不是引用整個代碼。
編輯
很高興聽到問題在列表中。 現在我發現您在適配器的第一行遇到了問題。 當你這樣做時,你正在創建一個新的空列表
private List<CartItem> cartItems = new ArrayList<>();
也許您可以考慮向適配器添加一個參數,例如
public class CartItemAdapter(List<CartItem> cartItems) extends RecyclerView.Adapter<CartItemAdapter.CartItemHolder>
您可以在適配器內使用該列表。 它應該已經被填充。 在您的onCreateView
方法中,您可以執行類似的操作
// create the list
private List<CartItem> cartItems = new ArrayList<>();
// populate the list with some element or elements
CartItem item = new CartItem(constructor parameters);
cartItems.add(item);
// create the adapter and send the list as a parameter
final CartItemAdapter adapter = new CartItemAdapter(cartItems)
recyclerView.setAdapter(adapter)
然后在您的適配器中,您可以根據需要使用cartItems
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.