在 firebase recyclerview 中保存状态和按钮点击

时间:2021-01-17 17:19:20

标签: android firebase mvvm android-recyclerview android-linearlayout

使用 firebase 获取数据并将其传递给适配器

    final int[] f = {0};
    String passedArg = getIntent().getExtras().getString("collection");
    assert passedArg != null;
    collectionReference = FirebaseFirestore.getInstance().collection(passedArg);

    cartAdapter = new CartAdapter(this);
    recyclerView = findViewById(R.id.vertical_recyclerview);
    searchView = (SearchView) findViewById(R.id.searchView);
    db = FirebaseFirestore.getInstance();

// getData();

    if (f[0] == 0) {

        Query query1 = collectionReference.orderBy("productName");

        FirestoreRecyclerOptions<horizontalProductModel> options = new FirestoreRecyclerOptions.Builder<horizontalProductModel>()
                .setQuery(query1, horizontalProductModel.class)
                .build();
        adapter = new verticalProductScrollAdapter(options, this);
        adapter.updateOptions(options);

        adapter.startListening();


        RecyclerView recyclerView = findViewById(R.id.vertical_recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

        recyclerView.setAdapter(adapter);
        adapter.hasStableIds();


        collectionReference
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {
                                Log.d(TAG, document.getId() + " => " + document.getData());
                            }
                        } else {
                            Log.w(TAG, "Error getting documents.", task.getException());
                        }
                    }
                });


        adapter.notifyDataSetChanged();


    }
    final ProductViewModel productViewModel = new ViewModelProvider(this, new ProductViewModelFactory(getApplication())).get(ProductViewModel.class);
    adapter.setOnItemClickListener(new verticalProductScrollAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(DocumentSnapshot documentSnapshot, int position) {

            Product product = documentSnapshot.toObject(Product.class);
            assert product != null;
            Log.d("inserted_in_cart", "" + product.getProductName());
            product.setUserQuantity(1);
            product.setUserPrice(product.getProductPrice());
            productViewModel.insert(product);

        }

        @Override
        public void onUpdateClick(DocumentSnapshot documentSnapshot, int count) {

            Product product = documentSnapshot.toObject(Product.class);
            product.setUserQuantity(count);
            product.setUserPrice(count * product.getProductPrice());
            productViewModel.updateQuantity(product.getProductName(), product.getUserQuantity(), product.getUserPrice());
            cartAdapter.notifyDataSetChanged();
        }

        @Override
        public void onDeleteClick(DocumentSnapshot documentSnapshot, int position) {
            Product product = documentSnapshot.toObject(Product.class);
            productViewModel.deleteQuantity(product.getProductName());

            Log.d(TAG, "onDeleteClick: deleted");
            cartAdapter.notifyDataSetChanged();
        }

        @Override
        public void onSubscribeClick(DocumentSnapshot documentSnapshot, int position) {
            Product product = documentSnapshot.toObject(Product.class);
      //Doing some task               );

        }

    });

    //recyclerview

   }




protected void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);

    // Save list state
    mListState = recyclerView.getLayoutManager().onSaveInstanceState();
    state.putParcelable(LIST_STATE_KEY, mListState);
}

protected void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);

    // Retrieve list state and list/item positions

    if (state != null)
        mListState = state.getParcelable(LIST_STATE_KEY);
}

@Override
protected void onStart() {
    super.onStart();

}

@Override
protected void onDestroy() {
    super.onDestroy();
    adapter.stopListening();
}

@Override
protected void onResume() {
    super.onResume();
    if (mListState != null) {
        recyclerView.getLayoutManager().onRestoreInstanceState(mListState);
    }

}

}

这是适配器类的代码,在这里我必须保存回收视图的状态,例如单击按钮并设置产品数量,然后在重新启动应用程序后我想要相同的状态。那么需要处理哪些部分。

public class verticalProductScrollAdapter extends FirestoreRecyclerAdapter<horizontalProductModel, verticalProductScrollAdapter.ViewHolder> {
private static final String TAG = "verticalProductAdapter";
private OnItemClickListener listener;

private Context context;

List<Product> product;

public verticalProductScrollAdapter(@NonNull FirestoreRecyclerOptions<horizontalProductModel> options, Context context) {
    super(options);
    this.context = context;
    product = new ArrayList<>();
}




@Override
protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull horizontalProductModel model) {

    holder.productName.setText(model.getProductName());
    holder.productQuantity.setText(model.getProductQuantity());
    holder.productPrice.setText(String.valueOf(model.getProductPrice()));
    holder.setIsRecyclable(false);
    try {

        Glide.with(context)
                .load(model.getProductImage())
                //  .centerCrop()
                .into(holder.productImage);
    } catch (Exception e) {
        Log.e(TAG, "onBindViewHolder: " + e.getMessage());
    }



}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.vertical_scroll_item_layout, parent, false);
    return new ViewHolder(v);
}


@Override
public void onError(@NonNull FirebaseFirestoreException e) {
    Log.d(TAG, "onError: " + e.getMessage());
}

class ViewHolder extends RecyclerView.ViewHolder {

    TextView productName, productPrice, productQuantity;
    ImageView productImage;
    Button addProduct, subscribe;
    ElegantNumberButton updateProduct;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        productImage = itemView.findViewById(R.id.productImageVertical);
        productName = itemView.findViewById(R.id.productNameVertical);
        productPrice = itemView.findViewById(R.id.productPriceVertical);
        productQuantity = itemView.findViewById(R.id.productQuantityVertical);
        addProduct = itemView.findViewById(R.id.addProductVertical);
        updateProduct = itemView.findViewById(R.id.updateProductVertical);

        subscribe = itemView.findViewById(R.id.subscribe);

        subscribe.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION && listener != null) {
                    listener.onSubscribeClick(getSnapshots().getSnapshot(position), position);
                }
            }
        });

        addProduct.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION && listener != null) {
                    addProduct.setVisibility(View.INVISIBLE);
                    updateProduct.setVisibility(View.VISIBLE);
                    updateProduct.setNumber("1");
                    listener.onItemClick(getSnapshots().getSnapshot(position), position);

                }
            }
        });

        updateProduct.setOnValueChangeListener(new ElegantNumberButton.OnValueChangeListener() {
            @Override
            public void onValueChange(ElegantNumberButton view, int oldValue, int newValue) {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION && listener != null) {

                    int count = Integer.parseInt(updateProduct.getNumber());
                    Log.d(TAG, "onValueChange: " + count + "pos" + position);
                    if (count == 0) {
                        updateProduct.setVisibility(View.INVISIBLE);
                        addProduct.setVisibility(View.VISIBLE);
                        listener.onDeleteClick(getSnapshots().getSnapshot(position), position);
                    } else
                        listener.onUpdateClick(getSnapshots().getSnapshot(position), count);
                }
            }
        });
    }


}

public interface OnItemClickListener {
    void onItemClick(DocumentSnapshot documentSnapshot, int position);

    void onUpdateClick(DocumentSnapshot documentSnapshot, int count);

    void onDeleteClick(DocumentSnapshot documentSnapshot, int position);

    void onSubscribeClick(DocumentSnapshot documentSnapshot, int position);
}

public void setOnItemClickListener(verticalProductScrollAdapter.OnItemClickListener listener) {

    this.listener = listener;
}

}

提前致谢。 您可以在 http://dailyb.ml

查看应用以供参考

0 个答案:

没有答案