CookBookMainActivity.java 14.7 KB
package com.naji.xiaotao.cookbook.ui;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;

import com.naji.xiaotao.R;
import com.naji.xiaotao.cart.ui.CartActivity;
import com.naji.xiaotao.common.dialog.RightDialog;
import com.naji.xiaotao.cookbook.bean.CookbookDetailEntity;
import com.naji.xiaotao.cookbook.bean.CookbookEntity;
import com.naji.xiaotao.cookbook.bean.OuterEntity;
import com.naji.xiaotao.cookbook.listener.CheckListener;
import com.naji.xiaotao.cookbook.itemdecoration.ItemHeaderDecoration;
import com.naji.xiaotao.cookbook.listener.RvListener;
import com.naji.xiaotao.cookbook.adapter.SortAdapter;
import com.naji.xiaotao.cookbook.service.CookbookApiService;
import com.naji.xiaotao.http.RetrofitClient;
import com.naji.xiaotao.order.ui.OrderActivity;
import com.naji.xiaotao.tangshi.entity.OrderEntity;
import com.naji.xiaotao.tangshi.ui.TangShiActivity;
import com.naji.xiaotao.util.DialogUtil;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import me.goldze.mvvmhabit.bus.RxBus;
import me.goldze.mvvmhabit.bus.RxSubscriptions;
import me.goldze.mvvmhabit.http.BaseResponse;
import me.goldze.mvvmhabit.http.ResponseThrowable;
import me.goldze.mvvmhabit.utils.KLog;
import me.goldze.mvvmhabit.utils.RxUtils;
import me.goldze.mvvmhabit.utils.SPUtils;
import me.goldze.mvvmhabit.utils.ToastUtils;

public class CookBookMainActivity extends AppCompatActivity implements CheckListener {
    private RecyclerView rvSort;
    private SortAdapter mSortAdapter;
    private CookbookDetailFragment mSortDetailFragment;
    private Context mContext;
    private LinearLayoutManager mLinearLayoutManager;
    private int targetPosition;//点击左边某一个具体的item的位置
    private boolean isMoved;
//    private SortBean mSortBean;

    private EditText searchEdt;//搜索输入框
    private TextView cartNumTv;//显示购物车数量
    private int cartNum=0;//购物车数量
    private Disposable mSubscription;//订阅者
    private Disposable mSubscription2;//顾客已下单订阅者
    private final ArrayList<CookbookEntity> clists=new ArrayList<>();//服务器返回数据
    private ArrayList<CookbookEntity> slists=new ArrayList<>();//搜索出的结果集
    private ArrayList<String> classList=new ArrayList<>();//分类列表数据

    private String orderid;
    private String messageid;
    private boolean isWaitingSure;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cookbook_main);
        mContext = this;
        orderid=getIntent().getStringExtra("orderid");
        messageid=getIntent().getStringExtra("messageid");
        isWaitingSure=getIntent().getBooleanExtra("isWaitingSure",false);
        initView();
        initData();
    }


    @Override
    protected void onStart() {
        super.onStart();
        registerRxBus();
        getCookbookList();
    }

    private void registerRxBus(){
        mSubscription= RxBus.getDefault().toObservable(Integer.class)
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        cartNum+=integer;
                        cartNumTv.setText(cartNum+"");
                        if(cartNum<=0){
                            cartNumTv.setVisibility(View.INVISIBLE);
                        }else{
                            cartNumTv.setVisibility(View.VISIBLE);
                        }
                    }
                });
        RxSubscriptions.add(mSubscription);
        mSubscription2= RxBus.getDefault().toObservable(String.class).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                if(!TextUtils.isEmpty(s)&&s.equals("hasorder")){//顾客已下单
                    final RightDialog dialog=new RightDialog();
                    Bundle bundle=new Bundle();
                    bundle.putString("msg","顾客已下单");
                    bundle.putBoolean("showIcon",false);
                    dialog.setArguments(bundle);
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            dialog.dismiss();
                            Intent intent=new Intent(mContext, TangShiActivity.class);
                            startActivity(intent);
                        }
                    }, 1000);
                    dialog.show(((AppCompatActivity)mContext).getSupportFragmentManager(),"rightDialog");
                }
            }
        });
        RxSubscriptions.add(mSubscription2);
    }

    @Override
    protected void onStop() {
        super.onStop();
        removeRxBus();
    }

    private void removeRxBus() {
        RxSubscriptions.remove(mSubscription);
        RxSubscriptions.remove(mSubscription2);
    }


    //获取菜单数据
    private void getCookbookList(){
        Map<String,String> params=new HashMap<>();
        params.put("sellerid", SPUtils.getInstance("user_info").getString("sellerid"));
        params.put("orderid",orderid);
        params.put("identity","2");//1  顾客  2 服务员
        if(!TextUtils.isEmpty(getIntent().getStringExtra("fromSource"))||isWaitingSure){//加菜/待确认订单
            params.put("status","1");
        }
        RetrofitClient.getInstance().create(CookbookApiService.class)
                .getCookbookList(params)
                .compose(RxUtils.schedulersTransformer())
                .compose(RxUtils.exceptionTransformer())
                .doOnSubscribe(new Consumer<Disposable>() {
                    @Override
                    public void accept(Disposable disposable) throws Exception {
                        try{
//                            DialogUtil.showDialog(CookBookMainActivity.this);
                        }catch(WindowManager.BadTokenException e){
                            e.printStackTrace();
                        }
                    }
                })
                .subscribe(new Consumer<BaseResponse<List<OuterEntity>>>() {
                    @Override
                    public void accept(BaseResponse<List<OuterEntity>> listBaseResponse) throws Exception {
                        //DialogUtil.dismissDialog();
                        if(listBaseResponse.getRet()==200){
                            slists.clear();
                            classList.clear();
                            clists.clear();
                            clists.addAll(listBaseResponse.getData().get(0).getList());
                            slists.addAll(clists);
                            cartNum=listBaseResponse.getData().get(0).getCountTotal();
                            cartNumTv.setText(cartNum+"");
                            if(cartNum<=0){
                                cartNumTv.setVisibility(View.INVISIBLE);
                            }else{
                                cartNumTv.setVisibility(View.VISIBLE);
                            }
                            //初始化左侧列表数据
                            for (int i = 0; i < slists.size(); i++) {
                                classList.add(slists.get(i).getClass_name());
                                mSortAdapter.notifyDataSetChanged();
                            }
                            mSortDetailFragment.initData(slists);
                        }else{
                            ToastUtils.showShort(listBaseResponse.getMsg());
                        }
                    }
                }, new Consumer<ResponseThrowable>() {
                    @Override
                    public void accept(ResponseThrowable throwable) throws Exception {
                        //DialogUtil.dismissDialog();
                        ToastUtils.showShort(throwable.msg);
                        throwable.printStackTrace();
                    }
                });
    }

    private void initData() {
        mSortAdapter = new SortAdapter(mContext, classList, new RvListener() {
            @Override
            public void onItemClick(int id, int position) {
                if (mSortDetailFragment != null) {
                    targetPosition = position;
                    setChecked(position, true);
                }
            }
        });
        rvSort.setAdapter(mSortAdapter);
        createFragment();
    }

    public void createFragment() {
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        mSortDetailFragment = new CookbookDetailFragment();
        Bundle bundle = new Bundle();
        bundle.putString("orderid",orderid);
        bundle.putBoolean("isWaitingSure",isWaitingSure);
        if(!TextUtils.isEmpty(getIntent().getStringExtra("fromSource"))){
            bundle.putString("fromSource",getIntent().getStringExtra("fromSource"));
        }
        mSortDetailFragment.setArguments(bundle);
        mSortDetailFragment.setListener(this);
        fragmentTransaction.add(R.id.lin_fragment, mSortDetailFragment);
        fragmentTransaction.commit();
    }

    private void setChecked(int position, boolean isLeft) {
        Log.d("p-------->", String.valueOf(position));
        if (isLeft) {
            mSortAdapter.setCheckedPosition(position);
            //此处的位置需要根据每个分类的集合来进行计算
            int count = 0;
            for (int i = 0; i < position; i++) {
                count += slists.get(i).getCookbooklist().get(0).size();
            }
            count += position;
            mSortDetailFragment.setData(count);
            ItemHeaderDecoration.setCurrentTag(String.valueOf(targetPosition));//凡是点击左边,将左边点击的位置作为当前的tag
        } else {
            mSortAdapter.setCheckedPosition(position);
            ItemHeaderDecoration.setCurrentTag(String.valueOf(position));//如果是滑动右边联动左边,则按照右边传过来的位置作为tag
        }
        moveToCenter(position);
    }

    //将当前选中的item居中
    private void moveToCenter(int position) {
        //将点击的position转换为当前屏幕上可见的item的位置以便于计算距离顶部的高度,从而进行移动居中
        View childAt = rvSort.getChildAt(position - mLinearLayoutManager.findFirstVisibleItemPosition());
        if (childAt != null) {
            int y = (childAt.getTop() - rvSort.getHeight() / 2);
            rvSort.smoothScrollBy(0, y);
    }
    }


    private void initView() {
        ((TextView)findViewById(R.id.title)).setText("菜谱");
        findViewById(R.id.back).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
        rvSort = (RecyclerView) findViewById(R.id.rv_sort);
        mLinearLayoutManager = new LinearLayoutManager(mContext);
        rvSort.setLayoutManager(mLinearLayoutManager);
        cartNumTv=findViewById(R.id.cart_num);
        findViewById(R.id.cart_num).setVisibility(View.INVISIBLE);
        findViewById(R.id.cart).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent(CookBookMainActivity.this, CartActivity.class);
                intent.putExtra("orderid",orderid);
                intent.putExtra("messageid",messageid);
                intent.putExtra("fromSource",getIntent().getStringExtra("fromSource"));
                intent.putExtra("isFast",getIntent().getBooleanExtra("isFast",false));
                intent.putExtra("isWaitingSure",isWaitingSure);
                startActivity(intent);
            }
        });
        searchEdt=findViewById(R.id.search_edt);
        searchEdt.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                searchCookbook(charSequence.toString());
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });
    }

    //搜索菜品
    private void searchCookbook(String keyword){
        classList.clear();
        slists.clear();
        if(TextUtils.isEmpty(keyword)){//如果搜索关键字为空,返回所有结果
            //初始化左侧列表数据
            for (int i = 0; i < clists.size(); i++) {
                classList.add(clists.get(i).getClass_name());
                mSortAdapter.notifyDataSetChanged();
            }
            slists.addAll(clists);
            mSortDetailFragment.initData(slists);
            return;
        }
        //遍历clists下所有菜品
        for(CookbookEntity entity:clists){
            CookbookEntity entity1=new CookbookEntity(entity);
            ArrayList<List<CookbookDetailEntity>> subLists=new ArrayList<>();
            ArrayList<CookbookDetailEntity> subLists2=new ArrayList<>();
            for(CookbookDetailEntity detail:entity.getCookbooklist().get(0)){
                if(detail.getName().contains(keyword)){//如果菜品名称中包含关键字keyword
                    subLists2.add(detail);
                }
            }
            subLists.add(subLists2);
            entity1.setCookbooklist(subLists);
            if(entity1.getCookbooklist().get(0).size()>0){
                slists.add(entity1);
            }
        }
        //初始化左侧列表数据
        for (int i = 0; i < slists.size(); i++) {
            classList.add(slists.get(i).getClass_name());
            mSortAdapter.notifyDataSetChanged();
        }
        mSortDetailFragment.initData(slists);

        if (mSortDetailFragment != null) {
            isMoved = true;
            targetPosition = 0;
            setChecked(0, true);
        }
    }


    @Override
    public void check(int position, boolean isScroll) {
        setChecked(position, isScroll);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        RxSubscriptions.remove(mSubscription);
    }
}