簡體   English   中英

RecyclerView 在 Fragment 上不可見

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM