-1
您好,我有一個cartFragment
和RecyclerView
,它由適配器類生成。使用適配器中的數據更改片段中的textview值
在適配器何時創建每個卡片視圖時,計算總值。最後,我想將此總數值傳遞給cartFragment
中的tvCartTotal
Textview
。
我能夠通過在cartFragment
中創建一個方法並從Adapter調用方法setTvCartTotal()
並將總值返回給Fragment來完成此操作。
但我能夠設置TextView
的唯一方法是將TextView
置於靜態字段中。我知道這會導致內存泄漏,但無法想到更好的解決方案。任何幫助?我還添加了代碼。
謝謝!
片段的購物:
public class ShoppingCartFragment extends Fragment {
private ArrayList<ShoppingCart> shoppingcartList = new ArrayList<>();
private static TextView tvCartTotal;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String TAG = "ShoppingFrag";
public ShoppingCartFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_shopping_cart, container, false);
RecyclerView rvShoppingCart = (RecyclerView)view.findViewById(R.id.rvShoppingCart);
rvShoppingCart.setHasFixedSize(true);
LinearLayoutManager manager = new LinearLayoutManager(getActivity());
rvShoppingCart.setLayoutManager(manager);
ShoppingCartAdapter shoppingCartAdapter = new ShoppingCartAdapter(getActivity());
rvShoppingCart.setAdapter(shoppingCartAdapter);
DatabaseHandler db = new DatabaseHandler(getActivity());
shoppingcartList = db.getAllShoppingCart();
shoppingCartAdapter.setshoppingcartList(shoppingcartList);
tvCartTotal = (TextView)view.findViewById(R.id.tvCartTotal);
return view;
}
@Override
public void onResume() {
super.onResume();
shoppingcartList.clear();
}
public void setTvCartTotal(String total) {
//TextView tvCartTotal = TextView.findViewById(R.id.tvCartTotal);
tvCartTotal.setText(total);
Log.d("ShoppingCartFrag: ",total);
}
}
適配器:
public class ShoppingCartAdapter extends RecyclerView.Adapter<ShoppingCartAdapter.ShoppingCartViewHolder> {
private ArrayList<ShoppingCart> shoppingcartList = new ArrayList<>();
private LayoutInflater layoutInflater;
private Context context;
private double cartTotal=0;
public ShoppingCartAdapter(Context context){
layoutInflater = LayoutInflater.from(context);
this.context = context;
}
public void setshoppingcartList(ArrayList<ShoppingCart> newList){
shoppingcartList = new ArrayList<>();
shoppingcartList.addAll(newList);
notifyDataSetChanged();
}
@Override
public ShoppingCartViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = layoutInflater.inflate(R.layout.shoppingcart_cardview, parent, false);
ShoppingCartViewHolder shoppingCartViewHolder = new ShoppingCartViewHolder(view);
return shoppingCartViewHolder;
}
@Override
public void onBindViewHolder(final ShoppingCartViewHolder holder, int position) {
final ShoppingCart shoppingCart = shoppingcartList.get(position);
holder.tvProductName.setText(shoppingCart.getProductName());
final double price = shoppingCart.getPrice();
holder.tvProductWholesalePrice.setText(Double.toString(price));
final double total = shoppingCart.getTotal();
holder.tvProductTotalSale.setText(Double.toString(total));
final int quantity = shoppingCart.getQuantity();
holder.etProductQuantity.setText(Integer.toString(quantity));
cartTotal = cartTotal + total;
ShoppingCartFragment shoppingCartFragment = new ShoppingCartFragment();
shoppingCartFragment.setTvCartTotal("$" + String.valueOf(String.format("%.2f", cartTotal)));
TextWatcher watcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
final int q = Integer.valueOf(holder.etProductQuantity.getText().toString());
final double total = price * q;
cartTotal = cartTotal - total;
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
int q = Integer.valueOf(holder.etProductQuantity.getText().toString());
final double total = price * q;
holder.tvProductTotalSale.setText(Double.toString(total));
cartTotal = cartTotal + total;
ShoppingCartFragment shoppingCartFragment = new ShoppingCartFragment();
shoppingCartFragment.setTvCartTotal("$" + String.valueOf(String.format("%.2f", cartTotal)));
}
};
holder.etProductQuantity.addTextChangedListener(watcher);
}
@Override
public int getItemCount() {
return shoppingcartList.size();
}
static class ShoppingCartViewHolder extends RecyclerView.ViewHolder {
private TextView tvProductName;
private TextView tvProductWholesalePrice;
private TextView tvProductTotalSale;
private EditText etProductQuantity;
public ShoppingCartViewHolder(View itemView) {
super(itemView);
tvProductName = (TextView)itemView.findViewById(R.id.tvProductName);
tvProductWholesalePrice = (TextView)itemView.findViewById(R.id.tvProductWholesalePrice);
tvProductTotalSale = (TextView)itemView.findViewById(R.id.tvProductTotalSale);
etProductQuantity = (EditText)itemView.findViewById(R.id.etProductQuantity);
}
}
}
謝謝您的意見@Chris購物車已經從數據庫中檢索。 總計變化,因爲當查看購物車時,用戶可以更改項目數量,如果發生這種情況TextWatcher更新itemTotal和cartTotal,然後需要更新cartTotal TextView。 cartTotal TextView與RecyclerView分離。 – Kurt
適配器包含您的購物車的最新版本。在您的適配器中創建一個返回cartTotal的方法,並從片段中調用此方法以刷新視圖。您現在需要回答的問題是如何觸發此刷新,我現在有限的時間內可以考慮的一種可能的解決方案是eventbus。 –
只是想讓你知道事件總線做的伎倆不知道它,但我現在喜歡它。 – Kurt