今天涉及 对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>