【问题标题】:Recyclerview showing data only first timeRecyclerview 仅第一次显示数据
【发布时间】:2019-01-14 16:58:27
【问题描述】:

所以我正在使用 firebase 来检索一些产品。我已经登录并且每次单击时都会通过数据。但显然recyclerview只显示一次数据。

这里是显示该问题的视频链接。 video link

设置 RecyclerView

private void setupRecyclerView() {
    Log.d(TAG, "setupRecyclerView: setting up recyclerview");
    productList = new ArrayList<>();
    rv.setHasFixedSize(true);
    rv.setLayoutManager(new LinearLayoutManager(getActivity()));
    this.adapter = new ProductListAdapter(productList);
    rv.setAdapter(adapter);
}

从 Firebase 获取产品

private void getProducts() {

    //Setting up Event Listener
    productsListener = new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            Product p = dataSnapshot.getValue(Product.class);
            Log.d(TAG, "onChildAdded: Adding Product = "+p.toString());

            //Pass Products to Proucts fragment
            addProduct(p);
        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            Log.d(TAG, "onChildChanged: child Product changed, snapshot="+dataSnapshot.toString());
            editProduct(dataSnapshot.getValue(Product.class));
        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    };

    //Get Products from firebase
    FirebaseDatabase.getInstance().getReference().child("user_photos").child(mFirebaseStoreID).addChildEventListener(productsListener);
}

添加产品方法

public void addProduct(Product newProduct) {
    double price=0;
    if (!newProduct.getAssociated_product_price().equals("")){
        price = Double.valueOf(newProduct.getAssociated_product_price());
    }
    productList.add(new ProductCard(newProduct.getAssociated_product_name(), newProduct.getAssociated_product_description(), newProduct.getImage_path(), price,newProduct.getPhoto_id()));
    adapter.notifyItemInserted(productList.size() - 1);
    Log.d(TAG, "addProduct: Product added total size= " + productList.size() + " and adapter size= " + adapter.getItemCount());
}

有很多代码,如果这还不够,请告诉我。不过这种行为很奇怪。

【问题讨论】:

  • rv.setHasFixedSize(false);试试这个或完全删除该行
  • @ZaidMirza 检查您在适配器中使用的layoutroot layout 是否将height 设置为match_parent 如果有,请将其更改为wrap_content

标签: android android-recyclerview


【解决方案1】:

setupRecyclerView 方法中删除rv.setHasFixedSize(false) 行。

docsetHasFixedSize 表示:

RecyclerView 可以执行多种优化,如果它可以知道 提前说明 RecyclerView 的大小不受适配器影响 内容。 RecyclerView 仍然可以根据其他的改变它的大小 因素(例如其父级的大小),但此大小计算不能 取决于其孩子的大小或其适配器的内容(除了 适配器中的项目数)。

如果您使用的 RecyclerView 属于此类别,请将其设置为 真的。它将允许 RecyclerView 避免使整个 适配器内容更改时的布局。

由于当您通知适配器插入的项目时您的内容正在更改,因此您不应将其设置为true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多