CategoryFragment中一级分类、二级分类的实现

CategoryFragment由分类栏、广告轮播和商品列表组成。点击分类,右侧商品列表会切换。通过OkHttpHelper获取数据,使用RecyclerView展示,并实现上拉加载、下拉刷新功能。点击商品跳转至详情页。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

到目前为止,已经实现了HomeFragmentHotFragment的大部分功能,剩下的点击后进入具体栏目的功能后面会具体实现。现在来实现CategoryFragment的界面,CategoryFragment是由左侧的分类栏,右侧上方的广告轮播组件,以及下方的商品列表组件实现。点击左侧的商品分类,右边的商品列表会切换。

①先来看一个完全没有封装过的版本

public class CategoryFragment extends Fragment {
    @ViewInject(R.id.recyclerview_category)
    private RecyclerView mRecyclerView;


    @ViewInject(R.id.recyclerview_wares)
    private RecyclerView mRecyclerviewWares;

    @ViewInject(R.id.refresh_layout)
    private MaterialRefreshLayout mRefreshLaout;

    @ViewInject(R.id.slider)
    private SliderLayout mSliderLayout;

    private CategoryAdapter mCategoryAdapter;
    private WaresAdapter mWaresAdatper;


    private OkHttpHelper mHttpHelper = OkHttpHelper.getInstance();


    private int currPage=1;
    private int totalPage=1;
    private int pageSize=10;
    private long category_id=0;


    private  static final int STATE_NORMAL=0;
    private  static final int STATE_REFREH=1;
    private  static final int STATE_MORE=2;

    private int state=STATE_NORMAL;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflaterViewGroup container,  Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_category,container,false);

        ViewUtils.inject(this, view);


        requestCategoryData();
        requestBannerData();

        initRefreshLayout();

//        initRecyclerView();
        return view;
    }

    /**
     * 3.下方的 上拉加载下拉刷新组件 + RecyclerView
     */
    
private void initRecyclerView(){

        String url = Contants.API.WARES_LIST+"?categoryId="+1+"&curPage="+currPage+"&pageSize="+pageSize;

        mHttpHelper.get(url, new BaseCallback<Page<Wares>>() {
            @Override
            public void onBeforeRequest(Request request) {

            }

            @Override
            public void onFailure(Request requestException e) {

            }

            @Override
            public void onResponse(Response response) {

            }

            @Override
            public void onSuccess(Response responsePage<Wares> waresPage) {

                Log.w("cate"waresPage.getList().size()+"");


                    mWaresAdatper new WaresAdapter(getContext()waresPage.getList());
                    mWaresAdatper.setOnItemClickListener(new BaseAdapter.OnItemClickListener() {
                        @Override
                        public void onItemClick(View view, int position) {
                            Wares wares = mWaresAdatper.getItem(position);

                            Intent intent = new Intent(getActivity()WareDetailActivity.class);

                            intent.putExtra(Contants.WARE,wares);
                            startActivity(intent);

                        }
                    });

                    mRecyclerviewWares.setAdapter(mWaresAdatper);

                    mRecyclerviewWares.setLayoutManager(new GridLayoutManager(getContext(),1));
                    mRecyclerviewWares.setItemAnimator(new DefaultItemAnimator());
                    mRecyclerviewWares.addItemDecoration(new DividerGridItemDecoration(getContext()));


            }


            @Override
            public void onError(Response response, int codeException e) {

            }
        });
    }
    private  void initRefreshLayout(){

        mRefreshLaout.setLoadMore(true);
        mRefreshLaout.setMaterialRefreshListener(new MaterialRefreshListener() {
            @Override
            public void onRefresh(MaterialRefreshLayout materialRefreshLayout) {

                refreshData();

            }

            @Override
            public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {

                if(currPage <=totalPage)
                    loadMoreData();
                else{
//                    Toast.makeText()
                    mRefreshLaout.finishRefreshLoadMore();
                }
            }
        });
    }
    private  void refreshData(){

        currPage =1;
        state=STATE_REFREH;
        requestWares(category_id);

    }
    private void loadMoreData(){

        currPage = ++currPage;
        state STATE_MORE;
        requestWares(category_id);

    }
    private void requestWares(long categoryId){
        String url = Contants.API.WARES_LIST+"?categoryId="+categoryId+"&curPage="+currPage+"&pageSize="+pageSize;
        mHttpHelper.get(url, new BaseCallback<Page<Wares>>() {
            @Override
            public void onBeforeRequest(Request request) {

            }
            @Override
            public void onFailure(Request requestException e) {

            }
            @Override
            public void onResponse(Response response) {

            }
            @Override
            public void onSuccess(Response responsePage<Wares> waresPage) {
                currPage = waresPage.getCurrentPage();
                totalPage =waresPage.getTotalPage();
                showWaresData(waresPage.getList());
            }
            @Override
            public void onError(Response response, int codeException e) {
            }
        });
    }
    private  void showWaresData(List<Wares> wares){
        switch (state){
            case  STATE_NORMAL:
                if(mWaresAdatper ==null) {
                    mWaresAdatper new WaresAdapter(getContext()wares);
                    mWaresAdatper.setOnItemClickListener(new BaseAdapter.OnItemClickListener() {
                        @Override
                        public void onItemClick(View view, int position) {
                            Wares wares = mWaresAdatper.getItem(position);
                            Intent intent = new Intent(getActivity()WareDetailActivity.class);
                            intent.putExtra(Contants.WARE,wares);
                            startActivity(intent);
                        }
                    });
                    mRecyclerviewWares.setAdapter(mWaresAdatper);
                    mRecyclerviewWares.setLayoutManager(new GridLayoutManager(getContext()1));
                    mRecyclerviewWares.setItemAnimator(new DefaultItemAnimator());
                    mRecyclerviewWares.addItemDecoration(new DividerGridItemDecoration(getContext()));
                }
                else{
                    mWaresAdatper.clear();
                    mWaresAdatper.addData(wares);
                }
                break;

            case STATE_REFREH:
                mWaresAdatper.clear();
                mWaresAdatper.addData(wares);
                mRecyclerviewWares.scrollToPosition(0);
                mRefreshLaout.finishRefresh();
                break;


            case STATE_MORE:
                mWaresAdatper.addData(mWaresAdatper.getDatas().size(),wares);
                mRecyclerviewWares.scrollToPosition(mWaresAdatper.getDatas().size());
                mRefreshLaout.finishRefreshLoadMore();
                break;
        }
    }
    /**
     * 2.显示广告轮播组件
     */
    
private void requestBannerData( ) {
        String url = Contants.API.BANNER+"?type=1";
        mHttpHelper.get(url, new SpotsCallBack<List<Banner>>(getContext()){
            @Override
            public void onSuccess(Response responseList<Banner> banners) {
                showSliderViews(banners);
            }

            @Override
            public void onError(Response response, int codeException e) {
            }
        });
    }
    private void showSliderViews(List<Banner> banners){
        if(banners !=null){
            for (Banner banner : banners){
                DefaultSliderView sliderView = new DefaultSliderView(this.getActivity());
                sliderView.image(banner.getImgUrl());
                sliderView.description(banner.getName());
                sliderView.setScaleType(BaseSliderView.ScaleType.Fit);
                mSliderLayout.addSlider(sliderView);
            }
        }
        mSliderLayout.setPresetIndicator(SliderLayout.PresetIndicators.Center_Bottom);
        mSliderLayout.setCustomAnimation(new DescriptionAnimation());
        mSliderLayout.setPresetTransformer(SliderLayout.Transformer.Default);
        mSliderLayout.setDuration(3000);
    }
    /**
     * 1.显示左侧的栏目RecyclerView
     */
    
private  void requestCategoryData(){
        mHttpHelper.get(Contants.API.CATEGORY_LIST, new SpotsCallBack<List<Category>>(getContext()) {
            @Override
            public void onSuccess(Response responseList<Category> categories) {
                showCategoryData(categories);
                if(categories !=null && categories.size()>0)
                    category_id = categories.get(0).getId();
                requestWares(category_id);
            }
            @Override
            public void onError(Response response, int codeException e) {
            }
        });
    }
    private  void showCategoryData(List<Category> categories){
        mCategoryAdapter new CategoryAdapter(getContext(),categories);
        mCategoryAdapter.setOnItemClickListener(new BaseAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Category category = mCategoryAdapter.getItem(position);
                category_id = category.getId();
                currPage=1;
                state=STATE_NORMAL;
                requestWares(category_id);
            }
        });
        mRecyclerView.setAdapter(mCategoryAdapter);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mRecyclerView.addItemDecoration(

                new DividerItemDecoration(getContext(),DividerItemDecoration.VERTICAL_LIST));
    }
}

 

基本上,实现分类的逻辑即为,为左侧RecyclerView中的每个栏目添加点击事件,按照类别ID去加载右侧数据

Category category = mCategoryAdapter.getItem(position);
                category_id = category.getId();
                currPage=1;
                state=STATE_NORMAL;
                requestWares(category_id);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值