到目前为止,已经实现了HomeFragment和HotFragment的大部分功能,剩下的点击后进入具体栏目的功能后面会具体实现。现在来实现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 inflater, ViewGroup 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 request, Exception e) {
}
@Override
public void onResponse(Response response) {
}
@Override
public void onSuccess(Response response, Page<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 code, Exception 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 request, Exception e) {
}
@Override
public void onResponse(Response response) {
}
@Override
public void onSuccess(Response response, Page<Wares> waresPage) {
currPage = waresPage.getCurrentPage();
totalPage =waresPage.getTotalPage();
showWaresData(waresPage.getList());
}
@Override
public void onError(Response response, int code, Exception 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 response, List<Banner> banners) {
showSliderViews(banners);
}
@Override
public void onError(Response response, int code, Exception 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 response, List<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 code, Exception 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);