package com.cheikh.lazywaimai.ui.fragment; import android.os.Bundle; import android.view.View; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import com.flipboard.bottomsheet.BottomSheetLayout; import java.util.List; import butterknife.Bind; import butterknife.OnClick; import com.cheikh.lazywaimai.R; import com.cheikh.lazywaimai.base.BaseController; import com.cheikh.lazywaimai.base.BaseFragment; import com.cheikh.lazywaimai.context.AppContext; import com.cheikh.lazywaimai.controller.BusinessController; import com.cheikh.lazywaimai.model.ShoppingCart; import com.cheikh.lazywaimai.model.bean.Business; import com.cheikh.lazywaimai.model.bean.ProductCategory; import com.cheikh.lazywaimai.model.bean.ResponseError; import com.cheikh.lazywaimai.util.ContentView; import com.cheikh.lazywaimai.ui.Display; import com.cheikh.lazywaimai.ui.adapter.ProductCategoryListAdapter; import com.cheikh.lazywaimai.ui.adapter.ProductItemAdapter; import com.cheikh.lazywaimai.util.CollectionUtil; import com.cheikh.lazywaimai.util.StringFetcher; import com.cheikh.lazywaimai.widget.MultiStateView; import com.cheikh.lazywaimai.widget.ShoppingCartPanel; import za.co.immedia.pinnedheaderlistview.PinnedHeaderListView; @ContentView(R.layout.fragment_product) public class ProductFragment extends BaseFragment<BusinessController.BusinessUiCallbacks> implements BusinessController.ProductListUi, BaseController.SubUi { @Bind(R.id.multi_state_view) MultiStateView mMultiStateView; @Bind(R.id.bottom_sheet_layout) BottomSheetLayout mBottomSheetLayout; @Bind(R.id.lv_product_category) ListView mCategoryListView; @Bind(R.id.lv_product_list) PinnedHeaderListView mProductListView; @Bind(R.id.layout_shopping_info) LinearLayout mShoppingInfoLayout; @Bind(R.id.img_cart_logo) ImageView mCartLogoImg; @Bind(R.id.txt_selected_count) TextView mSelectedCountTxt; @Bind(R.id.txt_total_price) TextView mTotalPriceTxt; @Bind(R.id.btn_settle) Button mSettleBtn; private ProductCategoryListAdapter mCategoryItemAdapter; private ProductItemAdapter mProductItemAdapter; private ShoppingCartPanel mShoppingCartPanel; private boolean isClickTrigger; private Business mBusiness; public static ProductFragment create(Business business) { ProductFragment fragment = new ProductFragment(); if (business != null) { Bundle bundle = new Bundle(); bundle.putSerializable(Display.PARAM_OBJ, business); fragment.setArguments(bundle); } return fragment; } @Override protected BaseController getController() { return AppContext.getContext().getMainController().getBusinessController(); } @Override protected void handleArguments(Bundle arguments) { if (arguments != null) { mBusiness = (Business) arguments.getSerializable(Display.PARAM_OBJ); } } @Override public Business getRequestParameter() { return mBusiness; } @Override protected void initializeViews(Bundle savedInstanceState) { mShoppingCartPanel = new ShoppingCartPanel(getContext()); // 商品分类的列表 mCategoryItemAdapter = new ProductCategoryListAdapter(); mCategoryListView.setAdapter(mCategoryItemAdapter); mCategoryListView.setSelection(0); mCategoryListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { int productPos = 0; for (int index = 0; index < position; index++) { // 加1是因为section也算一个位置 productPos += mProductItemAdapter.getCountForSection(index) + 1; } isClickTrigger = true; mProductListView.setSelection(productPos); } }); // 商品的列表 mProductItemAdapter = new ProductItemAdapter(getActivity()); mProductItemAdapter.setAnimTargetView(mCartLogoImg); mProductListView.setAdapter(mProductItemAdapter); mProductListView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (isClickTrigger) { isClickTrigger = false; } else { int section = mProductItemAdapter.getSectionForPosition(firstVisibleItem); mCategoryListView.setItemChecked(section, true); } } }); mMultiStateView.setState(MultiStateView.STATE_LOADING); } @OnClick({R.id.btn_settle, R.id.layout_shopping_info}) public void onClick(View view) { switch (view.getId()) { case R.id.btn_settle: getCallbacks().showSettle(); break; case R.id.layout_shopping_info: showShoppingCartPanel(); break; } } @Override public void onChangeItem(List<ProductCategory> items) { if (!CollectionUtil.isEmpty(items)) { mCategoryItemAdapter.setItems(items); mProductItemAdapter.setItems(items); showShoppingCartPanel(); refreshBottomUi(); mMultiStateView.setState(MultiStateView.STATE_CONTENT); } else { mMultiStateView.setState(MultiStateView.STATE_EMPTY) .setTitle(R.string.label_empty_product_list) .setButton(new View.OnClickListener() { @Override public void onClick(View v) { getCallbacks().refresh(); } }); } } @Override public void onResponseError(ResponseError error) { mMultiStateView.setState(MultiStateView.STATE_ERROR) .setTitle(error.getMessage()) .setButton(new View.OnClickListener() { @Override public void onClick(View v) { getCallbacks().refresh(); } }); } @Override public void onShoppingCartChange() { refreshBottomUi(); mShoppingCartPanel.refreshPanel(); mCategoryItemAdapter.notifyDataSetChanged(); mProductItemAdapter.notifyDataSetChanged(); } /** * 更新底部面板 */ private void refreshBottomUi() { ShoppingCart shoppingCart = ShoppingCart.getInstance(); int totalCount = shoppingCart.getTotalQuantity(); double totalPrice = shoppingCart.getTotalPrice(); double distancePrice = getCallbacks().distanceSettlePrice(mBusiness); mCartLogoImg.setSelected(totalCount > 0); mSelectedCountTxt.setText(StringFetcher.getString(R.string.label_count, totalCount)); mTotalPriceTxt.setText(StringFetcher.getString(R.string.label_price, totalPrice)); mSettleBtn.setEnabled(getCallbacks().enableSettle(mBusiness)); mSettleBtn.setText(distancePrice != 0 ? getString(R.string.label_distance_price, distancePrice) : getString(R.string.btn_settle)); } /** * 显示购物车面板 */ private void showShoppingCartPanel() { int count = ShoppingCart.getInstance().getTotalQuantity(); if (count > 0 && !mBottomSheetLayout.isSheetShowing()) { mBottomSheetLayout.showWithSheetView(mShoppingCartPanel); } else { mBottomSheetLayout.dismissSheet(); } } }