RecyclerView的基本使用:
没有点击事件的接口只能自己写:
public class ShopCarRecycleViewAdapter extends RecyclerView.Adapter<ShopCarRecycleViewAdapter.ViewHolder>{
private ArrayList<ShopCarData> shopCarDatas;
private MainActivity context;
private ShopCarView shopCarView;
//删除接口
private OnDeleteClickListener mOnDeleteClickListener;
//操作数量的接口
private OnEditClickListenter mOnEditClickListener;
private OnResfreshListener mOnResfreshListener;
public ArrayList<ShopCarData> getShopCarDatas() {
return shopCarDatas;
}
public ShopCarRecycleViewAdapter(MainActivity context, ArrayList<ShopCarData> shopCarDatas,ShopCarView shopCarView) {
super();
this.shopCarView=shopCarView;
this.shopCarDatas=shopCarDatas;
this.context=context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater=LayoutInflater.from(context);
View view= inflater.inflate(R.layout.shopcar_item,null);
ViewHolder viewHolder=new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
// Log.d("第"+position+"项数据获取是否isfirst",shopCarDatas.get(position).getIsFirst()+"");
holder.mTvshopname.setText(shopCarDatas.get(position).getShopname());
holder.productname.setText(shopCarDatas.get(position).getProducename());
holder.numberTV.setText(shopCarDatas.get(position).getNumber());
holder.poductprice.setText(shopCarDatas.get(position).getPrice());
byte[] bytes=shopCarDatas.get(position).getBytes();
if(bytes!=null){
BitmapFactory.Options o2 = new BitmapFactory.Options(); //这里定义了一个新的对象...获取的还是同一张图片...
o2.inSampleSize=8;
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length,o2);
holder.pic.setImageBitmap(bitmap);
}
else {
Log.d("购物车图片为空","null");
}
if (position > 0) {
if (shopCarDatas.get(position).getShopname().equals(shopCarDatas.get(position - 1).getShopname())) {
holder.llShopCartHeader.setVisibility(View.GONE);
} else {
holder.llShopCartHeader.setVisibility(View.VISIBLE);
}
}else {
holder.llShopCartHeader.setVisibility(View.VISIBLE);
}
//链接:http://www.jianshu.com/p/6c3328f87fc9
//根据选中的状态值进行重绘
//选中状态
if(shopCarDatas.get(position).isSelect()){
holder.shopproductSelect.setImageDrawable(context.getResources().getDrawable(R.drawable.shopcart_selected));
}else {
holder.shopproductSelect.setImageDrawable(context.getResources().getDrawable(R.drawable.shopcart_unselected));
}
if(shopCarDatas.get(position).isShopSelect()){
holder.shopselect.setImageDrawable(context.getResources().getDrawable(R.drawable.shopcart_selected));
}else {
holder.shopselect.setImageDrawable(context.getResources().getDrawable(R.drawable.shopcart_unselected));
}
// 每次绘制 刷新 都会触发这个方法
if(mOnResfreshListener != null){
boolean isSelect = false;
//返回一个是否全部选中的参数
for(int i = 0;i < shopCarDatas.size(); i++){
if(!shopCarDatas.get(i).isSelect()){
isSelect = false;
break;
}else{
isSelect = true;
}
}
mOnResfreshListener.onResfresh(isSelect,position);
}
//设置商品点击时间,并通知重绘
holder.shopproductSelect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//如果点击一定和当前状态不同,设置点击的状态
shopCarDatas.get(position).setSelect(!shopCarDatas.get(position).isSelect());
//通过循环找出不同商铺被标记的第一个商品的位置
for(int i = 0;i < shopCarDatas.size(); i++){
if(shopCarDatas.get(i).getIsFirst() == 1) {
//遍历去找出同一家商铺的所有商品的勾选情况
for(int j = 0;j < shopCarDatas.size();j++){
//如果是同一家商铺的商品,并且其中一个商品是未选中,
//那么商铺的全选勾选取消
if(shopCarDatas.get(j).getShopname().equals(shopCarDatas.get(i).getShopname().toString())
&& !shopCarDatas.get(j).isSelect()){
shopCarDatas.get(i).setShopSelect(false);
break;
}else{
//如果是同一家商铺的商品,并且所有商品是选中,那么商铺的选中全选勾选
shopCarDatas.get(i).setShopSelect(true);
}
}
}
}
notifyDataSetChanged();
}
});
//商店购销点击事件
holder.shopselect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//如果position的isFirst为1,证明是每个商铺的第一件商品
//而且这件商品有商铺的头部header
if(shopCarDatas.get(position).getIsFirst() == 1) {
//isShopSelect取反选
shopCarDatas.get(position).setShopSelect(!shopCarDatas.get(position).isShopSelect());
for(int i = 0;i < shopCarDatas.size();i++){
//如果Shopid与position的Shopid相同,
// 则设置它的选中情况与position的isShopSelect选中情况一样
if(shopCarDatas.get(i).getShopname().equals(shopCarDatas.get(position).getShopname().toString()) ){
shopCarDatas.get(i).setSelect(shopCarDatas.get(position).isShopSelect());
}
}
notifyDataSetChanged();
}
}
});
holder.minusIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//
int number=Integer.parseInt(shopCarDatas.get(position).getNumber());
if(number>0){
String producename=shopCarDatas.get(position).getProducename();
number=number-1;
if (mOnEditClickListener != null) {
Log.d("mOnEditClick","1234");
mOnEditClickListener.onEditClick( position,producename,number);
}
else {
Log.d("mOnEditClick","null");
}
shopCarDatas.get(position).setNumber(number+"");
notifyDataSetChanged();
}
}
});
holder.addIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int number=Integer.parseInt(shopCarDatas.get(position).getNumber());
String producename=shopCarDatas.get(position).getProducename();
number=number+1;
if (mOnEditClickListener != null) {
mOnEditClickListener.onEditClick( position,producename,number);
}
else {
}
shopCarDatas.get(position).setNumber(number+"");
notifyDataSetChanged();
}
});
holder.deleteIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//调用删除某个规格商品的接口
if(mOnDeleteClickListener != null){
mOnDeleteClickListener.onDeleteClick(view,position,shopCarDatas.get(position).getProducename());
}
shopCarDatas.remove(position);
//重新排序,标记所有商品不同商铺第一个的商品位置
shopCarView.isSelectFirst(shopCarDatas);
notifyDataSetChanged();
}
});
}
//提供删除接口
public interface OnDeleteClickListener{
void onDeleteClick(View view, int position, String productname);
}
public void setOnDeleteClickListener(OnDeleteClickListener mOnDeleteClickListener){
this.mOnDeleteClickListener = mOnDeleteClickListener;
}
//提供更改数量的接口
public interface OnEditClickListenter{
void onEditClick(int postion, String productname, int count);
}
public void setOnEditClickListenter(OnEditClickListenter onEditClickListenter){
this.mOnEditClickListener =onEditClickListenter;
}
//和Acitivity 交互的回调
public interface OnResfreshListener{
void onResfresh(boolean isSelect,int postion);
}
public void setResfreshListener(OnResfreshListener mOnResfreshListener){
this.mOnResfreshListener = mOnResfreshListener;
}
@Override
public int getItemCount() {
return shopCarDatas.size();
}
//自定义的ViewHolder,持有每个Item的的所有界面元素
public static class ViewHolder extends RecyclerView.ViewHolder {
//店名
//商品名
@BindView(R.id.tv_item_shopcart_shopname)
public TextView mTvshopname;
//数量
@BindView(R.id.et_item_shopcart_cloth_num)
public TextView numberTV;
//商店布局
@BindView(R.id.ll_shopcart_header)
LinearLayout llShopCartHeader;
@BindView(R.id.tv_item_shopcart_productname)
TextView productname;
@BindView(R.id.tv_item_shopcart_product_price)
TextView poductprice;
@BindView(R.id.iv_item_shopcart_shopselect)
ImageView shopselect;
@BindView(R.id.tv_item_shopcart_clothselect)
ImageView shopproductSelect;
@BindView(R.id.iv_item_shopcart_cloth_minus)
ImageView minusIV;
@BindView(R.id.iv_item_shopcart_cloth_add)
ImageView addIV;
@BindView(R.id.iv_item_shopcart_cloth_delete)
ImageView deleteIV;
@BindView(R.id.shopcar_pic)
ImageView pic;
public ViewHolder(View view){
super(view);
ButterKnife.bind(this,view);
}
}
//
//
}
setAdapter:
tvcommitOrder=shopcarview.findViewById(R.id.tv_shopcart_submit);
//设置布局管理器
mRecyclerView.setLayoutManager(new LinearLayoutManager(mainActivity));
//设置adapter
mRecyclerView.setAdapter(shopCarRecycleViewAdapter);
//设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//添加分割线
// mRecyclerView.addItemDecoration(new DividerItemDecoration(mainActivity, DividerItemDecoration.HORIZONTAL_LIST));
basePager_fl.addView(shopcarview);
几种回调事件的实现思路
//全选
tvShopCartSelect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(user!=null){
mSelect = !mSelect;
if(mSelect){
Drawable left = mainActivity.getResources().getDrawable(R.drawable.shopcart_selected);
tvShopCartSelect.setCompoundDrawablesWithIntrinsicBounds(left,null,null,null);
for(int i = 0;i < shopCarDatas.size();i++){
shopCarDatas.get(i).setSelect(true);
shopCarDatas.get(i).setShopSelect(true);
}
}else{
Drawable left = mainActivity.getResources().getDrawable(R.drawable.shopcart_unselected);
tvShopCartSelect.setCompoundDrawablesWithIntrinsicBounds(left,null,null,null);
for(int i = 0;i < shopCarDatas.size();i++){
shopCarDatas.get(i).setSelect(false);
shopCarDatas.get(i).setShopSelect(false);
}
}
shopCarRecycleViewAdapter.notifyDataSetChanged();
}
}
});
//更改数量
shopCarRecycleViewAdapter.setOnEditClickListenter(new ShopCarRecycleViewAdapter.OnEditClickListenter() {
@Override
public void onEditClick(int postion, String productname, int count) {
userDb.updataSCProductnunber(user.getAccount(),productname,count+"");
}
});
//删除
shopCarRecycleViewAdapter.setOnDeleteClickListener(new ShopCarRecycleViewAdapter.OnDeleteClickListener() {
@Override
public void onDeleteClick(View view, int position, String productname) {
userDb.deletePdinShopcar(user.getAccount(),productname);
//删除数据后重新计算最下面两栏的数据
Log.d("删除回调","执行");
//这里因为比上一个慢半拍所以等于1 其实已经是没有数据了
if(shopCarDatas.size()==1){
tv_shopcart_totalprice.setText("总价:" + 0);
tvShopCartTotalNum.setText("共" +0 + "件商品");
}
else {
}
}
});
//
shopCarRecycleViewAdapter.setResfreshListener(new ShopCarRecycleViewAdapter.OnResfreshListener() {
@Override
public void onResfresh(boolean isSelect,int positon) {
Log.d("onResfresh","!!resfresh");
//处理点击后图标变化的
mSelect = isSelect;
if (mSelect) {
Drawable left = mainActivity.getResources().getDrawable(R.drawable.shopcart_selected);
tvShopCartSelect.setCompoundDrawablesWithIntrinsicBounds(left, null, null, null);
} else {
Drawable left = mainActivity.getResources().getDrawable(R.drawable.shopcart_unselected);
tvShopCartSelect.setCompoundDrawablesWithIntrinsicBounds(left, null, null, null);
}
if (positon==shopCarDatas.size()-1){
//遍历集合 给后面的赋值 而赋值操作只有最后一项绘制完成后才需要。
int mTotalNum = 0;
int mTotalPrice=0;
for(int i = 0; i < shopCarDatas.size(); i++)
if(shopCarDatas.get(i).isSelect()) {
float oneprice = Integer.parseInt(shopCarDatas.get(i).getPrice());
float number= Integer.parseInt(shopCarDatas.get(i).getNumber());
mTotalPrice += oneprice * number;
mTotalNum += 1;
}
tv_shopcart_totalprice.setText("总价:" + mTotalPrice);
tvShopCartTotalNum.setText("共" + mTotalNum + "件商品");
Log.d("第"+positon+"项","(最后一项)改变Text");
}
else {
Log.d("第"+positon+"项","正在判断select");
}
}
});
tvcommitOrder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(user!=null){
Intent startsureOrderActivity=new Intent(mainActivity, SureOrderActivity.class);
ArrayList<ShopCarData> selectShopCardata=new ArrayList<ShopCarData>();
for(int i = 0; i < shopCarDatas.size(); i++)
if(shopCarDatas.get(i).isSelect()) {
selectShopCardata.add(shopCarDatas.get(i));
}
startsureOrderActivity.putExtra("dataBean",selectShopCardata);
startsureOrderActivity.putExtra("flag","shopcar");
mainActivity.startActivity(startsureOrderActivity);
}
}
});
}
/**
* 给每个商品添加头属性
* @param list
*/
public static void isSelectFirst(ArrayList<ShopCarData> list){
if(list.size() > 0) {
//头个商品一定属于它所在商铺的第一个位置,isFirst标记为1.
list.get(0).setIsFirst(1);
for (int i = 1; i < list.size(); i++) {
//每个商品跟它前一个商品比较,如果Shopid相同isFirst则标记为2,
//如果Shopid不同,isFirst标记为1.
if (list.get(i).getShopname().equals(list.get(i - 1).getShopname().toString())) {
list.get(i).setIsFirst(2);
} else {
list.get(i).setIsFirst(1);
}
}
}
}
//全选
tvShopCartSelect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(user!=null){
mSelect = !mSelect;
if(mSelect){
Drawable left = mainActivity.getResources().getDrawable(R.drawable.shopcart_selected);
tvShopCartSelect.setCompoundDrawablesWithIntrinsicBounds(left,null,null,null);
for(int i = 0;i < shopCarDatas.size();i++){
shopCarDatas.get(i).setSelect(true);
shopCarDatas.get(i).setShopSelect(true);
}
}else{
Drawable left = mainActivity.getResources().getDrawable(R.drawable.shopcart_unselected);
tvShopCartSelect.setCompoundDrawablesWithIntrinsicBounds(left,null,null,null);
for(int i = 0;i < shopCarDatas.size();i++){
shopCarDatas.get(i).setSelect(false);
shopCarDatas.get(i).setShopSelect(false);
}
}
shopCarRecycleViewAdapter.notifyDataSetChanged();
}
}
});
//更改数量
shopCarRecycleViewAdapter.setOnEditClickListenter(new ShopCarRecycleViewAdapter.OnEditClickListenter() {
@Override
public void onEditClick(int postion, String productname, int count) {
userDb.updataSCProductnunber(user.getAccount(),productname,count+"");
}
});
//删除
shopCarRecycleViewAdapter.setOnDeleteClickListener(new ShopCarRecycleViewAdapter.OnDeleteClickListener() {
@Override
public void onDeleteClick(View view, int position, String productname) {
userDb.deletePdinShopcar(user.getAccount(),productname);
//删除数据后重新计算最下面两栏的数据
Log.d("删除回调","执行");
//这里因为比上一个慢半拍所以等于1 其实已经是没有数据了
if(shopCarDatas.size()==1){
tv_shopcart_totalprice.setText("总价:" + 0);
tvShopCartTotalNum.setText("共" +0 + "件商品");
}
else {
}
}
});
//
shopCarRecycleViewAdapter.setResfreshListener(new ShopCarRecycleViewAdapter.OnResfreshListener() {
@Override
public void onResfresh(boolean isSelect,int positon) {
Log.d("onResfresh","!!resfresh");
//处理点击后图标变化的
mSelect = isSelect;
if (mSelect) {
Drawable left = mainActivity.getResources().getDrawable(R.drawable.shopcart_selected);
tvShopCartSelect.setCompoundDrawablesWithIntrinsicBounds(left, null, null, null);
} else {
Drawable left = mainActivity.getResources().getDrawable(R.drawable.shopcart_unselected);
tvShopCartSelect.setCompoundDrawablesWithIntrinsicBounds(left, null, null, null);
}
if (positon==shopCarDatas.size()-1){
//遍历集合 给后面的赋值 而赋值操作只有最后一项绘制完成后才需要。
int mTotalNum = 0;
int mTotalPrice=0;
for(int i = 0; i < shopCarDatas.size(); i++)
if(shopCarDatas.get(i).isSelect()) {
float oneprice = Integer.parseInt(shopCarDatas.get(i).getPrice());
float number= Integer.parseInt(shopCarDatas.get(i).getNumber());
mTotalPrice += oneprice * number;
mTotalNum += 1;
}
tv_shopcart_totalprice.setText("总价:" + mTotalPrice);
tvShopCartTotalNum.setText("共" + mTotalNum + "件商品");
Log.d("第"+positon+"项","(最后一项)改变Text");
}
else {
Log.d("第"+positon+"项","正在判断select");
}
}
});
tvcommitOrder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(user!=null){
Intent startsureOrderActivity=new Intent(mainActivity, SureOrderActivity.class);
ArrayList<ShopCarData> selectShopCardata=new ArrayList<ShopCarData>();
for(int i = 0; i < shopCarDatas.size(); i++)
if(shopCarDatas.get(i).isSelect()) {
selectShopCardata.add(shopCarDatas.get(i));
}
startsureOrderActivity.putExtra("dataBean",selectShopCardata);
startsureOrderActivity.putExtra("flag","shopcar");
mainActivity.startActivity(startsureOrderActivity);
}
}
});
}
/**
* 给每个商品添加头属性
* @param list
*/
public static void isSelectFirst(ArrayList<ShopCarData> list){
if(list.size() > 0) {
//头个商品一定属于它所在商铺的第一个位置,isFirst标记为1.
list.get(0).setIsFirst(1);
for (int i = 1; i < list.size(); i++) {
//每个商品跟它前一个商品比较,如果Shopid相同isFirst则标记为2,
//如果Shopid不同,isFirst标记为1.
if (list.get(i).getShopname().equals(list.get(i - 1).getShopname().toString())) {
list.get(i).setIsFirst(2);
} else {
list.get(i).setIsFirst(1);
}
}
}
}
Adapter 的细节处理:
可以通过多个构造函数 生成一个 Adapter 并将List 根据构造函数赋值
这样做的意义在于 可以先初始化 再更新数据
public FlashSaleRecycleViewAdapter() {
this.repositories = null;
}
public FlashSaleRecycleViewAdapter(ArrayList<FlashPruductData> repositories) {
this.repositories = repositories;
}
获取布局可以和直接通过parent 参数 这样构造函数就不用 传递context 了
@Override
public RepositoryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.flashsale_rv_item, parent, false);
RepositoryViewHolder viewHolder=new RepositoryViewHolder(itemView);
return viewHolder;
}
出现的特殊问题:
adapter 中的Bitmap 回收问题!
可以注意在 view 被收回时可以执行一些 方法 回收资源
但是不可以回收一个正在被使用的Bitmap