购物车

Adapter

public class MyBigAdapter extends RecyclerView.Adapter<MyBigAdapter.Holder> {

    private Context mContext;
    private List<MyData.ResultBean> mList;

    public MyBigAdapter(Context mContext, List<MyData.ResultBean> mList) {
        this.mContext = mContext;
        this.mList = mList;
    }

    @NonNull
    @Override
    public Holder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.recy_big, null);
        Holder holder = new Holder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull Holder holder, final int i) {
        holder.mBigTv.setText(mList.get(i).getCategoryName() + "");
        SmallAdapter adapter = new SmallAdapter(mList.get(i).getShoppingCartList(), i);
        holder.mSamllRecy.setAdapter(adapter);
        holder.mBigCheck.setChecked(setBigCheck(i));
        holder.mBigCheck.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (callback != null) {
                    callback.bigCheckClick(i);
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }

    public class Holder extends RecyclerView.ViewHolder {
        private CheckBox mBigCheck;
        private TextView mBigTv;
        private RecyclerView mSamllRecy;

        public Holder(@NonNull View itemView) {
            super(itemView);
            mBigCheck = itemView.findViewById(R.id.Big_CheckBox);
            mBigTv = itemView.findViewById(R.id.Big_Text);
            mSamllRecy = itemView.findViewById(R.id.small_Recy);
            mSamllRecy.setLayoutManager(new LinearLayoutManager(mContext));
        }
    }

    //具体商品的适配器


    class SmallAdapter extends RecyclerView.Adapter<SmallAdapter.SamllHolder> {
        private List<MyData.ResultBean.ShoppingCartListBean> mList;
        private int bigIndex;

        public SmallAdapter(List<MyData.ResultBean.ShoppingCartListBean> list, int bigIndex) {
            this.mList = list;
            this.bigIndex = bigIndex;
        }

        @NonNull
        @Override
        public SamllHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            View view = View.inflate(mContext, R.layout.recy_samll, null);
            SamllHolder holder = new SamllHolder(view);
            return holder;
        }

        @Override
        public void onBindViewHolder(@NonNull SamllHolder samllHolder, final int i) {
            samllHolder.mPrice.setText(mList.get(i).getPrice() + "");
            Glide.with(mContext).load(mList.get(i).getPic()).into(samllHolder.mImage);
            samllHolder.mSmallName.setText(mList.get(i).getCommodityName() + "");
            samllHolder.myAddOrRemoveView.setNumber(mList.get(i).getCount());
            samllHolder.mSmallCheck.setChecked(mList.get(i).isStatus());
            samllHolder.mSmallCheck.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (callback != null) {
                        callback.smallCheckClick(bigIndex, i);
                    }
                }
            });
            samllHolder.myAddOrRemoveView.setItemCount(new MyAddOrRemoveView.ItemCount() {
                @Override
                public void setItemCount(int number) {
                   if (callback!=null){
                       callback.smallCheckClickCount(bigIndex,i,number);
                   }
                }
            });
        }

        @Override
        public int getItemCount() {
            return mList.size();
        }

        public class SamllHolder extends RecyclerView.ViewHolder {
            private CheckBox mSmallCheck;
            private TextView mSmallName, mPrice;
            private ImageView mImage;
            private MyAddOrRemoveView myAddOrRemoveView;

            public SamllHolder(@NonNull View itemView) {
                super(itemView);
                mSmallCheck = itemView.findViewById(R.id.small_Check);
                mSmallName = itemView.findViewById(R.id.small_Name);
                mPrice = itemView.findViewById(R.id.small_Price);
                mImage = itemView.findViewById(R.id.samll_Image);
                myAddOrRemoveView = itemView.findViewById(R.id.AddOrRemove);
            }
        }
    }

    public interface ShoppingCallback {
        void bigCheckClick(int bigIndex);

        void smallCheckClick(int bigIndex, int smallIndex);

        void smallCheckClickCount(int bigIndex, int smallIndex, int number);
    }

    private ShoppingCallback callback;

    public void setCallback(ShoppingCallback callback) {
        this.callback = callback;
    }

    //接下来就是业务逻辑方法的时候了
    //判断商家是否要选中
    public boolean setBigCheck(int bigIndex) {
        boolean flag = true;
        MyData.ResultBean resultBean = mList.get(bigIndex);
        for (int i = 0; i < resultBean.getShoppingCartList().size(); i++) {
            if (!resultBean.getShoppingCartList().get(i).isStatus()) {
                flag = false;
                return flag;
            }
        }
        return flag;
    }

    //当我点击商家的复选框的时候
    public void setBigCheckStatus(int bigIndex, boolean isStatus) {
        List<MyData.ResultBean.ShoppingCartListBean> cartList = mList.get(bigIndex).getShoppingCartList();
        for (MyData.ResultBean.ShoppingCartListBean cardBean : cartList) {
            cardBean.setStatus(isStatus);
        }
    }

    //当我点击商品让他选中
    public void setSmallCheck(int bigIndex, int smallIndex, boolean isCheck) {
        mList.get(bigIndex).getShoppingCartList().get(smallIndex).setStatus(isCheck);
    }

    //当我点击Activity中的全选按钮式
    public boolean isAllChecked() {
        boolean isAllchecked = true;
        for (int i = 0; i < mList.size(); i++) {
            List<MyData.ResultBean.ShoppingCartListBean> shoppingCartList = mList.get(i).getShoppingCartList();
            for (int j = 0; j < shoppingCartList.size(); j++) {
                if (!shoppingCartList.get(j).isStatus()) {
                    isAllchecked = false;
                    return isAllchecked;
                }
            }
        }
        return isAllchecked;
    }

    public void setAllChecked(boolean isCheck) {
        for (int i = 0; i < mList.size(); i++) {
            List<MyData.ResultBean.ShoppingCartListBean> shoppingCartList = mList.get(i).getShoppingCartList();
            for (int j = 0; j < shoppingCartList.size(); j++) {
                shoppingCartList.get(j).setStatus(isCheck);
            }
        }
    }

    //计算总价格
    public int allPrice() {
        int allprice = 0;
        for (int i = 0; i < mList.size(); i++) {
            List<MyData.ResultBean.ShoppingCartListBean> shoppingCartList = mList.get(i).getShoppingCartList();
            for (int j = 0; j < shoppingCartList.size(); j++) {
                if (shoppingCartList.get(j).isStatus()) {
                    allprice += shoppingCartList.get(j).getPrice() * shoppingCartList.get(j).getCount();
                }
            }
        }
        return allprice;
    }

    //计算总数量
    public int allNumber() {
        int count = 0;
        for (int i = 0; i < mList.size(); i++) {
            List<MyData.ResultBean.ShoppingCartListBean> shoppingCartList = mList.get(i).getShoppingCartList();
            for (int j = 0; j < shoppingCartList.size(); j++) {
                if (shoppingCartList.get(j).isStatus()) {
                    count += shoppingCartList.get(j).getCount();
                }
            }
        }
        return count;
    }
}

Api

public interface ApiService {
    @GET
    Observable<ResponseBody> getInfoNoParams(@Url String url);

    @GET
    Observable<ResponseBody> getInfoParams(@Url String url, @QueryMap Map<String, Object> map);

    @GET
    Observable<ResponseBody> getHeadrInfo(@Url String url, @HeaderMap Map<String, Object> map);

}

BaseActivity

public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements IContract.IView,View.OnClickListener {
    public P mPresenter;
    public EventBus eventBus;
    private Unbinder bind;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getLayoutId() != 0) {
            setContentView(getLayoutId());
            bind = ButterKnife.bind(this);
            eventBus = EventBus.getDefault();
            initViews();
            mPresenter = getPresenter();
            if (mPresenter != null) {
                mPresenter.onAttch(this);
                startCoding();
            }
        }
    }
    //EventBus那个页面想用那个页面调用这个方法就行
    public void registerEventbus() {
        eventBus.register(this);
    }

    public abstract P getPresenter();

    public abstract int getLayoutId();

    public abstract void initViews();

    public abstract void startCoding();

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mPresenter.onDeAttch();
        mPresenter = null;
        if (eventBus.isRegistered(this)) {
            eventBus.unregister(this);
        }
        if (bind != null) {
            bind.unbind();
        }
    }
}

BasePresenter

public abstract class BasePresenter<V extends IContract.IView> implements IContract.IPresenter{
    private WeakReference<V> mWeakReference;

    public BasePresenter() {
        initModel();
    }

    public abstract void initModel();

    public void onAttch(V v) {
        mWeakReference = new WeakReference<>(v);
    }

    public void onDeAttch() {
        if (mWeakReference != null) {
            mWeakReference.clear();
            mWeakReference = null;
        }
    }

    public V getV() {
        return mWeakReference.get();
    }
}

Contract

public interface IContract {
    interface IModel {
        //没有参数的时候
        void doGetNoParams(String url, Class cls, ModelCallback callback);

        void doGetParams(String url, Class cls, Map<String, Object> map, ModelCallback callback);

        void doPostParams(String url, Class cls, Map<String, Object> map, ModelCallback callback);
    }

    interface IView<T> {
        void onSuccess(T t);

        void onError(String error);
    }

    interface IPresenter {
        void startGetNoParamsRequest(String url, Class cls);

        void startGetRequest(String url, Class cls, Map<String, Object> map);

        void doPostParams(String url, Class cls, Map<String, Object> map, ModelCallback callback);
    }

    interface ModelCallback<T> {
        void onSuccess(T t);

        void onError(String error);
    }
}

Model

public class ModelImpl implements IContract.IModel {

    //无参数的Get请求
    @Override
    public void doGetNoParams(String url, Class cls, final IContract.ModelCallback callback) {
        NetUtils.getInstance().getInfo(url, cls, new NetUtils.NetCallback() {
            @Override
            public void onSuccess(Object o) {
                callback.onSuccess(o);
            }

            @Override
            public void onError(String str) {
                callback.onError(str);
            }
        });
    }

    @Override
    public void doGetParams(String url, Class cls, Map<String, Object> map, final IContract.ModelCallback callback) {
            NetUtils.getInstance().getHeaderInfo(url, map, cls, new NetUtils.NetCallback() {
                @Override
                public void onSuccess(Object o) {
                    callback.onSuccess(o);
                }

                @Override
                public void onError(String str) {
                    callback.onError(str);
                }
            });
    }

    @Override
    public void doPostParams(String url, Class cls, Map<String, Object> map, IContract.ModelCallback callback) {

    }
}

Presenter

public class PresenterImpl extends BasePresenter {
    private ModelImpl model;
    @Override
    public void initModel() {
        model = new ModelImpl();
    }

    @Override
    public void startGetNoParamsRequest(String url, Class cls) {
        model.doGetNoParams(url, cls, new IContract.ModelCallback() {
            @Override
            public void onSuccess(Object o) {
                getV().onSuccess(o);
            }

            @Override
            public void onError(String error) {
                getV().onError(error);
            }
        });
    }

    @Override
    public void startGetRequest(String url, Class cls, Map<String, Object> map) {
        model.doGetParams(url, cls, map, new IContract.ModelCallback() {
            @Override
            public void onSuccess(Object o) {
                getV().onSuccess(o);
            }

            @Override
            public void onError(String error) {
                getV().onSuccess(error);
            }
        });
    }

    @Override
    public void doPostParams(String url, Class cls, Map<String, Object> map, IContract.ModelCallback callback) {

    }
}

Url

public interface MyUrls {
    String BASEURL = "http://172.17.8.100/small/";

    //banner接口
    String BANNER = "commodity/v1/bannerShow";
    //首页接口
    String HOMEPAGE = "commodity/v1/commodityList";
    //二级购物车
    String SHOPPINGCARD = "order/verify/v1/findShoppingCart";
}

Utils

public class NetUtils {

    private ApiService apiService;

    private NetUtils() {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .readTimeout(10, TimeUnit.SECONDS)
                .addInterceptor(interceptor)
                .build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(MyUrls.BASEURL)
                .client(okHttpClient)
                //结合Rxjava使用
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                //结合Gson使用
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        apiService = retrofit.create(ApiService.class);
    }

    private static class NetHolder {
        private static final NetUtils netUtils = new NetUtils();
    }

    public static NetUtils getInstance() {
        return NetHolder.netUtils;
    }

    //没有请求头参数
    public void getInfo(String url, final Class cls, final NetCallback callback) {
        apiService.getInfoNoParams(url).subscribeOn(Schedulers.io())//被观察者在什么线程上工作
                .observeOn(AndroidSchedulers.mainThread())//观察者相应一般都是在主线程
                .subscribe(new Observer<ResponseBody>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }
                    @Override
                    public void onNext(ResponseBody responseBody) {
                        Gson gson = new Gson();
                        try {
                            Object object = gson.fromJson(responseBody.string(), cls);
                            if (callback != null) {
                                callback.onSuccess(object);
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    @Override
                    public void onError(Throwable e) {
                        if (callback != null) {
                            callback.onError(e.getMessage());
                        }
                    }
                    @Override
                    public void onComplete() {
						
												
                    }
                });
    }

    //有请求头参数的
    public void getHeaderInfo(String url, Map<String, Object> map, final Class cls, final NetCallback callback) {
        apiService.getHeadrInfo(url, map).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<ResponseBody>() {
                    @Override
                    public void accept(ResponseBody responseBody) throws Exception {
                        if (callback != null) {
                            Gson gson = new Gson();
                            Object obj = gson.fromJson(responseBody.string(), cls);
                            callback.onSuccess(obj);
                        }
                    }
                });
    }

    public interface NetCallback<T> {
        void onSuccess(T t);

        void onError(String str);
    }

}

AddRemove

public class MyAddOrRemoveView extends LinearLayout implements View.OnClickListener {
    private TextView mAdd, mNumber, mRemove;

    public MyAddOrRemoveView(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.add_remove_layout, this);
        initViews();
    }

    public void setNumber(int number) {
        mNumber.setText(number + "");
    }

    private void initViews() {
        mAdd = findViewById(R.id.Add);
        mNumber = findViewById(R.id.Number);
        mRemove = findViewById(R.id.Remove);
        mAdd.setOnClickListener(this);
        mRemove.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int count = Integer.parseInt(mNumber.getText().toString());
        switch (v.getId()) {
            case R.id.Add:
                count++;
                mNumber.setText(count + "");
                if (itemCount != null) {
                    itemCount.setItemCount(count);
                }
                break;
            case R.id.Remove:
                if (count > 1) {
                    count--;
                    mNumber.setText(count + "");
                    if (itemCount != null) {
                        itemCount.setItemCount(count);
                    }
                } else {
                    Toast.makeText(getContext(), "数量最少为1", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

    public interface ItemCount {
        void setItemCount(int number);
    }

    private ItemCount itemCount;

    public void setItemCount(ItemCount itemCount) {
        this.itemCount = itemCount;
    }
}

MianActivity

public class MainActivity extends BaseActivity {

    @BindView(R.id.recy_View)
    RecyclerView mRecy;
    private List<MyData.ResultBean> mList = new ArrayList<>();
    private MyBigAdapter mAdapter;
    @BindView(R.id.All_check)
    CheckBox All_check;
    @BindView(R.id.All_Price)
    TextView All_Price;
    @BindView(R.id.All_Count)
    TextView All_Count;

    @Override
    public BasePresenter getPresenter() {
        return new PresenterImpl();
    }

    @Override
    public int getLayoutId() {
        return R.layout.activity_main;
    }

    @Override
    public void initViews() {
        All_check.setOnClickListener(this);
        mRecy.setLayoutManager(new LinearLayoutManager(this));
    }

    @Override
    public void startCoding() {
        mAdapter = new MyBigAdapter(this, mList);
        mRecy.setAdapter(mAdapter);
        Map<String, Object> map = new HashMap<>();
        map.put("userId", "10922");
        map.put("sessionId", "157559325456410922");
        mPresenter.startGetRequest(MyUrls.SHOPPINGCARD, MyData.class, map);
        mAdapter.setCallback(new MyBigAdapter.ShoppingCallback() {
            @Override
            public void bigCheckClick(int bigIndex) {
                boolean b = mAdapter.setBigCheck(bigIndex);
                mAdapter.setBigCheckStatus(bigIndex, !b);
                mAdapter.notifyDataSetChanged();
                allCalculation();
            }

            @Override
            public void smallCheckClick(int bigIndex, int smallIndex) {
                boolean status = mList.get(bigIndex).getShoppingCartList().get(smallIndex).isStatus();
                mAdapter.setSmallCheck(bigIndex, smallIndex, !status);
                mAdapter.notifyDataSetChanged();
                allCalculation();
            }

            @Override
            public void smallCheckClickCount(int bigIndex, int smallIndex, int number) {
                mList.get(bigIndex).getShoppingCartList().get(smallIndex).setCount(number);
                mAdapter.notifyDataSetChanged();
                allCalculation();
            }
        });
    }

    @Override
    public void onSuccess(Object o) {
        if (o instanceof MyData) {
            mList.addAll(((MyData) o).getResult());
            mAdapter.notifyDataSetChanged();
        }
    }

    @Override
    public void onError(String error) {

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.All_check:
                boolean allChecked = mAdapter.isAllChecked();
                mAdapter.setAllChecked(!allChecked);
                All_check.setChecked(!allChecked);
                mAdapter.notifyDataSetChanged();
                All_Count.setText("总数量:" + mAdapter.allNumber());
                All_Price.setText("总价格:" + mAdapter.allPrice());
                break;
        }


    }

    private void allCalculation() {
        boolean allChecked = mAdapter.isAllChecked();
        All_check.setChecked(allChecked);
        All_Count.setText("总数量:" + mAdapter.allNumber());
        All_Price.setText("总价格:" + mAdapter.allPrice());
    }
}

activity.xml

public class MainActivity extends BaseActivity {

    @BindView(R.id.recy_View)
    RecyclerView mRecy;
    private List<MyData.ResultBean> mList = new ArrayList<>();
    private MyBigAdapter mAdapter;
    @BindView(R.id.All_check)
    CheckBox All_check;
    @BindView(R.id.All_Price)
    TextView All_Price;
    @BindView(R.id.All_Count)
    TextView All_Count;

    @Override
    public BasePresenter getPresenter() {
        return new PresenterImpl();
    }

    @Override
    public int getLayoutId() {
        return R.layout.activity_main;
    }

    @Override
    public void initViews() {
        All_check.setOnClickListener(this);
        mRecy.setLayoutManager(new LinearLayoutManager(this));
    }

    @Override
    public void startCoding() {
        mAdapter = new MyBigAdapter(this, mList);
        mRecy.setAdapter(mAdapter);
        Map<String, Object> map = new HashMap<>();
        map.put("userId", "10922");
        map.put("sessionId", "157559325456410922");
        mPresenter.startGetRequest(MyUrls.SHOPPINGCARD, MyData.class, map);
        mAdapter.setCallback(new MyBigAdapter.ShoppingCallback() {
            @Override
            public void bigCheckClick(int bigIndex) {
                boolean b = mAdapter.setBigCheck(bigIndex);
                mAdapter.setBigCheckStatus(bigIndex, !b);
                mAdapter.notifyDataSetChanged();
                allCalculation();
            }

            @Override
            public void smallCheckClick(int bigIndex, int smallIndex) {
                boolean status = mList.get(bigIndex).getShoppingCartList().get(smallIndex).isStatus();
                mAdapter.setSmallCheck(bigIndex, smallIndex, !status);
                mAdapter.notifyDataSetChanged();
                allCalculation();
            }

            @Override
            public void smallCheckClickCount(int bigIndex, int smallIndex, int number) {
                mList.get(bigIndex).getShoppingCartList().get(smallIndex).setCount(number);
                mAdapter.notifyDataSetChanged();
                allCalculation();
            }
        });
    }

    @Override
    public void onSuccess(Object o) {
        if (o instanceof MyData) {
            mList.addAll(((MyData) o).getResult());
            mAdapter.notifyDataSetChanged();
        }
    }

    @Override
    public void onError(String error) {

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.All_check:
                boolean allChecked = mAdapter.isAllChecked();
                mAdapter.setAllChecked(!allChecked);
                All_check.setChecked(!allChecked);
                mAdapter.notifyDataSetChanged();
                All_Count.setText("总数量:" + mAdapter.allNumber());
                All_Price.setText("总价格:" + mAdapter.allPrice());
                break;
        }


    }

    private void allCalculation() {
        boolean allChecked = mAdapter.isAllChecked();
        All_check.setChecked(allChecked);
        All_Count.setText("总数量:" + mAdapter.allNumber());
        All_Price.setText("总价格:" + mAdapter.allPrice());
    }
}

addremove.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/Add"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="➕" />

    <TextView
        android:id="@+id/Number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="10" />

    <TextView
        android:id="@+id/Remove"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="➖" />
</LinearLayout>

recybig

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <CheckBox
            android:id="@+id/Big_CheckBox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/Big_Text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/small_Recy"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView>
</LinearLayout>

recysmall.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <CheckBox
        android:id="@+id/small_Check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/samll_Image"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@mipmap/ic_launcher" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/small_Name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="nike内裤" />

        <TextView
            android:id="@+id/small_Price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="38.9" />

        <soexample.umeng.com.day07_shopping_car_demo.weight.MyAddOrRemoveView
            android:id="@+id/AddOrRemove"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
</LinearLayout>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽产业链(动力电池及材料、电驱电控、汽半导体/电子、整、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值