第4天


今天涉及  对RecycleView的Adapter进行封装 .  分类页面的界面设置    以及 自定义购物车商品加减控件

一.RecycleView的封装

洪洋博客

http://blog.csdn.net/lmj623565791/article/details/47251585

1.baseAdapter


<span style="font-size:14px;">/**
 * Created by asus on 2016/10/24.
 * 封装Adapter
 */
public abstract class BaseAdapter<T, H extends BaseViewHolder> extends RecyclerView.Adapter<BaseViewHolder> {

    protected List<T> mdatas;
    protected Context context;
    protected LayoutInflater mInflater;
    protected int layoutResId;

    public BaseAdapter(List<T> datas, Context context, int layoutResId) {
        this.mdatas = datas;
        this.context = context;
        this.layoutResId = layoutResId;
        mInflater = LayoutInflater.from(context);
    }

    //获取数据的size
    @Override
    public int getItemCount() {

        if (mdatas != null && mdatas.size() > 0)

            return mdatas.size();

        return 0;
    }

    //返回的holder通过baseViewHOlder
    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //view的布局id也需要外界传入
        View view = mInflater.inflate(layoutResId, parent, false);
        return new BaseViewHolder(view, listener);//将点击事件传递给BaseViewHolder
    }


    //绑定数据(泛型,由子类实现)
    @Override
    public void onBindViewHolder(BaseViewHolder holder, int position) {
        T t = getItem(position);
        bindData(holder, t);
    }

    //获取点击的item
    public T getItem(int position) {
        return mdatas.get(position);
    }

    //由子类实现设置数据
    public abstract void bindData(BaseViewHolder holder, T t);

    //清除数据
    public void clearData() {
        mdatas.clear();
    }

    //增加数据
    public void addData(List<T> datas) {
//        if (datas != null && datas.size() > 0) {
//            mdatas.addAll(datas);
//        }
        addData(0,datas);

    }

    //增加数据,局部改变适配器
    public void addData(int position, List<T> datas) {
        if (datas != null && datas.size() > 0) {
            mdatas.addAll(datas);
            notifyDataSetChanged();
            //notifyItemRangeChanged(position, mdatas.size());
        }
    }

    public List<T> getDatas() {
        return mdatas;
    }



    //recycleView没有设置点击事件(自己设置接口,监听)
    private OnHotClickListener listener;

    public interface OnHotClickListener{
        void onclick(View view, int position);
    }

    public void setHotClickListener(OnHotClickListener listener){
        this.listener = listener;
    }
}</span>

2.BaseViewHolder

/**
 * Created by asus on 2016/10/24.
 * 封装ViewHolder
 */
public class BaseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    private SparseArray<View> views;//避免重新findViewbyid,将view进行保存,可以重复使用
    private BaseAdapter.OnHotClickListener listener;

    public BaseViewHolder(View itemView, BaseAdapter.OnHotClickListener listener) {
        super(itemView);

        this.views = new SparseArray<View>();
        this.listener = listener;
        //itemView的点击事件
        itemView.setOnClickListener(this);
    }
    //暴露的方法去获取对象
    public View getView(int id) {
        return findView(id);
    }

    //通过传入的id去查找控件
    private <T extends View> T findView(int id) {

        View view = views.get(id);

        if (view == null) {

            view = itemView.findViewById(id);

            views.put(id, view);
        }

        return (T)view;

    }

    //设置方法,byId可以获取不同对象

    public TextView getTextView(int viewId) {
        return findView(viewId);
    }

    public Button getButton(int viewId) {
        return findView(viewId);
    }

    public ImageView getImageView(int viewId) {
        return findView(viewId);
    }


    /**
     * Called when a view has been clicked.
     *
     * @param v The view that was clicked.
     */
    @Override
    public void onClick(View v) {
        if(listener!=null)
            //itemView的点击事件回调给外界
        listener.onclick(v,getLayoutPosition());
    }
}

二.分类页面的设置

/**
 * 分类页面
 */
public class CategoryFragment extends Fragment {

    @ViewInject(R.id.recyclerview_category)//1.左侧列表recycleView
    private RecyclerView mRecyclerView;

    @ViewInject(R.id.slider)
    private SliderLayout mSliderLayout;//2.轮播条

    @ViewInject(R.id.refresh_layout)//3.下拉刷新和加载更多
    private MaterialRefreshLayout mRefreshLaout;

    @ViewInject(R.id.recyclerview_wares)//4.右侧列表详情recycleView
    private RecyclerView mRecyclerviewWares;
    //
    private CategoryAdapter mCategoryAdapter;
    private SimpleAdapter msinpleAdapter;


    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;


    private OkHttpHelper mHttpHelper = OkHttpHelper.getInstance();

    @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();//设置刷新和加载

        return view;
    }

    private void initRefreshLayout() {
        mRefreshLaout.setLoadMore(true);//可以加载更多

        mRefreshLaout.setMaterialRefreshListener(new MaterialRefreshListener() {
            @Override//下拉刷新
            public void onRefresh(MaterialRefreshLayout materialRefreshLayout) {
                refreshData();
            }

            @Override//加载更多
            public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
                System.out.println(currPage+"__________"+totalPage);//3----2
                if (currPage <= totalPage)
                    loadMoreData();
                else
                  //  ToastUtil.showToast(getActivity(), "没有更多数据");
                mRefreshLaout.finishRefreshLoadMore();//取消加载

            }
        });
    }


    private void refreshData() {
        state = STATE_REFREH;
        currPage = 1;
        requestWares(category_id);
    }

    private void loadMoreData() {
        state = STATE_MORE;
        currPage = ++currPage;
        requestWares(category_id);
    }


    private void requestCategoryData() {

        mHttpHelper.get(Contants.API.CATEGORY_LIST, new SpotsCallBack<List<Category>>(getActivity(), true) {


            @Override
            public void onSuccess(Response response, List<Category> categories) {

                showSlideViews(categories);//展示轮播图

                if (categories != null && categories.size() > 0) {//如果里面有东西。就可以去拿给右侧列表

                    category_id = categories.get(0).getId();//默认获取第一个列表的id

                    requestWares(category_id);//加载数据

                }

            }


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

            }
        });
    }

    private void requestWares(long categoryId) {

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

        mHttpHelper.get(url, new SpotsCallBack<Page<Wares>>(getActivity(), false) {


            @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 (msinpleAdapter == null) {
                    msinpleAdapter = new SimpleAdapter(wares,getContext());
                    mRecyclerviewWares.setAdapter(msinpleAdapter);

                    mRecyclerviewWares.setLayoutManager(new GridLayoutManagerWrapper(getContext(), 2));
                    mRecyclerviewWares.setItemAnimator(new DefaultItemAnimator());
                    mRecyclerviewWares.addItemDecoration(new DividerGridItemDecoration(getContext()));
                } else {
                    msinpleAdapter.clearData();
                    msinpleAdapter.addData(wares);
                }
                break;
            case STATE_REFREH:
                msinpleAdapter.clearData();
                msinpleAdapter.addData(wares);
              //  msinpleAdapter.notifyDataSetChanged();
                mRecyclerviewWares.scrollToPosition(0);
                mRefreshLaout.finishRefresh();//停止刷新

                break;
            case STATE_MORE:
                msinpleAdapter.addData(msinpleAdapter.getDatas().size(),wares);
                mRecyclerviewWares.scrollToPosition(msinpleAdapter.getDatas().size());
                mRefreshLaout.finishRefreshLoadMore();
                break;

        }

    }

    /**
     * 设置左侧recycleView
     */
    private void showSlideViews(final List<Category> categories) {

        mCategoryAdapter = new CategoryAdapter(categories, getActivity());

        mRecyclerView.setAdapter(mCategoryAdapter);
        mRecyclerView.setLayoutManager(new LinearLayoutManagerWrapper(this.getActivity()));//垂直
        mRecyclerView.addItemDecoration(new DividerItemDecortion(2,2,2,0));//设置分割线自定义的
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());

        //设置item点击事件
        mCategoryAdapter.setHotClickListener(new BaseAdapter.OnHotClickListener() {
            @Override
            public void onclick(View view, int position) {
                Category category = mCategoryAdapter.getItem(position);

                category_id = category.getId();//获取点击的item的id
                currPage = 1;
                state = STATE_NORMAL;

                requestWares(category_id);
            }
        });

    }


    private void requestBannerData() {
        String url = Contants.API.BANNER + "?type=1";
        mHttpHelper.get(url, new SpotsCallBack<List<Banner>>(getActivity(), false) {


            @Override
            public void onSuccess(Response response, List<Banner> banners) {
                showBannerViews(banners);
            }


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

            }
        });
    }

    //展示轮播
    private void showBannerViews(List<Banner> banners) {

        if (banners != null) {

            for (Banner banner : banners) {

                //设置一个带有文字描述
                TextSliderView textSliderView = new TextSliderView(this.getActivity());
                textSliderView.image(banner.getImgUrl());
                textSliderView.description(banner.getName());
                textSliderView.setScaleType(BaseSliderView.ScaleType.Fit);
                mSliderLayout.addSlider(textSliderView);

            }
        }
        //设置指示器
        mSliderLayout.setPresetIndicator(SliderLayout.PresetIndicators.Center_Bottom);

        mSliderLayout.setCustomAnimation(new DescriptionAnimation());
        mSliderLayout.setPresetTransformer(SliderLayout.Transformer.Default);//设置轮播的动画
        mSliderLayout.setDuration(3000);

    }
}


javabean文件

/**
热点页面
 */
public class Page<T> {


    private  int currentPage;
    private  int pageSize;
    private  int totalPage;
    private  int totalCount;

    private List<T> list;


    public int getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public int getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }

    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }
}


/**
 * 热点页面
 */
public class Wares implements Serializable {


    private Long id;
    private String name;
    private String imgUrl;
    private String description;
    private Float price;


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getImgUrl() {
        return imgUrl;
    }

    public void setImgUrl(String imgUrl) {
        this.imgUrl = imgUrl;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }
}



三.自定义购物车加减控件


/**
 * Created by asus on 2016/10/25.
 */
public class NumAddSupView extends LinearLayout implements View.OnClickListener {
    private LayoutInflater inflater;
    private Button buttonsup;
    private TextView text;
    private Button buttonadd;

    private int minValue;
    private int Value;
    private int maxValue;


    public NumAddSupView(Context context) {
        this(context, null);
    }

    public NumAddSupView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public NumAddSupView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        if (attrs != null) {
            //获取自定义属性
            TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.NumAddSupView);
            minValue = array.getInteger(R.styleable.NumAddSupView_minValue, 1);//最小值
            Value = array.getInteger(R.styleable.NumAddSupView_Value, 1);//值
            maxValue = array.getInteger(R.styleable.NumAddSupView_maxValue, 10);//最大值
            array.recycle();
        }

        inflater = LayoutInflater.from(context);
        initView();
    }

    private void initView() {
        View view = inflater.inflate(R.layout.num_add_sup, this, true);
        buttonsup = (Button) view.findViewById(R.id.sup);
        text = (TextView) view.findViewById(R.id.text);
        buttonadd = (Button) view.findViewById(R.id.add);
        setValue(Value);
        buttonsup.setOnClickListener(this);
        buttonadd.setOnClickListener(this);
    }

    //设置text的值
    public void setValue(int value) {
        Value = value;
        text.setText(Value + "");
    }
    //加按钮
    public void addValue(int value) {

        value++;
        if (value > maxValue) {
            value = maxValue;
        }
        setValue(value);
    }
    //减按钮
    public void supValue(int value) {
        value--;
        if (value < minValue) {
            value = minValue;
        }
        setValue(value);
    }



    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.sup) {
            //减按钮点击事件
            supValue(Value);
            if (listener != null)
                listener.onsupclick(v,Value);//外界拿到这个控件和值

        } else if (v.getId() == R.id.add) {
            //加按钮点击事件
            addValue(Value);
            if (listener != null)
                listener.onAddclick(v,Value);
        }
    }


    //接口的点击事件
    private OnButtonClickListener listener;

    public void setOnButtonClickListener(OnButtonClickListener listener) {
        this.listener = listener;
    }

    interface OnButtonClickListener {
        void onAddclick(View view,int value);

        void onsupclick(View view,int value);
    }

}

2.attr文件夹 属性

<declare-styleable name="NumAddSupView">

    <attr name="minValue" format="integer|reference"></attr>
    <attr name="Value" format="integer|reference"></attr>
    <attr name="maxValue" format="integer|reference"></attr>
</declare-styleable>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值