使用RecycleView加载不同的布局(类似淘宝京东购物车+推荐商品列表)
2017-05-25 16:12
525 查看
最近项目中加入了数据统计,也对应的需要在购物车底部加入推荐商品,类似淘宝京东的购物车,上部是购物车列表,下部是推荐商品,如图:
之前我们的购物车用的是ListView,如果修改的话有以下几种方案:
1.使用GridView,将原来的购物车的ListView作为头布局,但是这一种头布局中的item是不会复用的
2.使用ScrollView,里边嵌套一个ListView和一个GridView,这样更糟糕ListView和GridView的item是不会复用的
3.使用RecycleView加载不同的布局
然后我们通过gridLayoutManager.setSpanSizeLookup来设置position处的item
的跨度.这一步也是最重要的一步.
注意:跨度是指这个item所占几列.
LoadDifferentViewAdapter:
点击这里下载源码
之前我们的购物车用的是ListView,如果修改的话有以下几种方案:
1.使用GridView,将原来的购物车的ListView作为头布局,但是这一种头布局中的item是不会复用的
2.使用ScrollView,里边嵌套一个ListView和一个GridView,这样更糟糕ListView和GridView的item是不会复用的
3.使用RecycleView加载不同的布局
本文以第三种为例,进行叙述:
1.设置布局管理器
首先我们这里是上边是一列,下边是两列.选择GridLayoutManager,参数传入2列.然后我们通过gridLayoutManager.setSpanSizeLookup来设置position处的item
的跨度.这一步也是最重要的一步.
/** * 传入所有列数的最小公倍数,1和2的最小公倍数为2,即意味着每一行将被分为2格 */ GridLayoutManager gridLayoutManager = new GridLayoutManager(MainActivity.this, 2); //设置表格,根据position计算在该position处item的跨度(占几列数据) gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { //计算在哪个position时跨度,当购物车数据是要占满一行 那么跨度就是2 if (position < cartList.size()) { return 2; } else {//当推荐商品数据是要只占1列 那么跨度就是1 return 1; } } });
注意:跨度是指这个item所占几列.
2.下边分别贴出MainActivity和LoadDifferentViewAdapter的代码
MainActivitypublic class MainActivity extends Activity { private RecyclerView recyclerView; private LoadDifferentViewAdapter adapter; private ArrayList<ProInfo> cartList; private ArrayList<ProInfo> recommendList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cartList = getCartList(); recommendList = getRecommendList(); /** * 传入所有列数的最小公倍数,1和2的最小公倍数为2,即意味着每一行将被分为2格 */ GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2); //设置表格,根据position计算在该position处item的跨度(占几列数据) gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { //计算在哪个position时跨度,当购物车数据是要占满一行 那么跨度就是2 if (position < cartList.size()) { return 2; } else {//当推荐商品数据是要只占1列 那么跨度就是1 return 1; } } }); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); adapter = new LoadDifferentViewAdapter(this, cartList, recommendList); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(gridLayoutManager); } private String proName[] = {"酸奶", "塑料袋", "抽纸", "水杯", "蔬菜", "数字", "镜子", "牙刷"}; /** * 添加购物车数据 * * @return */ public ArrayList<ProInfo> getCartList() { ArrayList<ProInfo> cartList = new ArrayList<>(); for (int i = 0; i < proName.length; i++) { cartList.add(new ProInfo(proName[i], i + "")); } return cartList; } /** * 添加推荐商品的数据 * * @return */ public ArrayList<ProInfo> getRecommendList() { ArrayList<ProInfo> recommendList = new ArrayList<>(); for (int i = 0; i < proName.length; i++) { recommendList.add(new ProInfo(proName[i])); } return recommendList; } }
LoadDifferentViewAdapter:
public class LoadDifferentViewAdapter extends RecyclerView.Adapter<BaseViewHolder> { private List<ProInfo> cartProInfos; private List<ProInfo> recommendProInfos; private Context context; private OnItemClickLitener itemClickLitener; public void updateData(ArrayList<ProInfo> recommendList) { this.recommendProInfos.clear(); this.recommendProInfos.addAll(recommendList); notifyDataSetChanged(); } // Provide a reference to the type of views that you are using // (custom viewholder) public class ViewHolder1 extends BaseViewHolder { public TextView tv_count; public TextView tv_name; public ImageView iv_pro; public ViewHolder1(View v) { super(v); } } public class ViewHolder2 extends BaseViewHolder { public TextView tv_name; public ViewHolder2(View v) { super(v); } } public void setOnItemClickLitener(OnItemClickLitener itemClickLitener) { this.itemClickLitener = itemClickLitener; } public interface OnItemClickLitener { void onItemClick(View view, int position); } // Provide a suitable constructor (depends on the kind of dataset) public LoadDifferentViewAdapter(Context context, List<ProInfo> proInfos, List<ProInfo> recommendProInfos) { this.cartProInfos = proInfos; this.recommendProInfos = new ArrayList<>(); this.recommendProInfos.addAll(recommendProInfos); this.context = context; } // Return the size of your dataset (invoked by the layout manager) @Override public int getItemCount() { return cartProInfos.size() + recommendProInfos.size() ; } // Replace the contents of a view (invoked by the layout manager) @Override public void onBindViewHolder(BaseViewHolder holder, final int position) { switch (getItemViewType(position)) { case 0: final ViewHolder1 holder1 = (ViewHolder1) holder; ProInfo proInfo = cartProInfos.get(position); holder1.tv_count.setText("X" + proInfo.count); holder1.tv_name.setText("X" + proInfo.name); holder1.iv_pro.setImageResource(R.mipmap.ic_launcher); final int p = position; holder1.iv_pro.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (itemClickLitener != null) { itemClickLitener.onItemClick(v, position); } Toast.makeText(context, "you has click me ! " + position, Toast.LENGTH_SHORT) .show(); } }); break; case 1: final ViewHolder2 holder2 = (ViewHolder2) holder; holder2.tv_name.setText(recommendProInfos.get(position - cartProInfos.size()).name); break; } } @Override public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = null; BaseViewHolder holder = null; switch (viewType) { case 0: view = LayoutInflater.from(context).inflate(R.layout.recycler_view_item, parent, false); ViewHolder1 holder1 = new ViewHolder1(view); holder1.iv_pro = (ImageView) view.findViewById(R.id.iv_pro); holder1.tv_count = (TextView) view.findViewById(R.id.tv_count); holder1.tv_name = (TextView) view.findViewById(R.id.tv_name); holder = holder1; break; case 1: view = LayoutInflater.from(context).inflate(R.layout.recycler_view_item1, parent, false); ViewHolder2 holder2 = new ViewHolder2(view); holder2.tv_name = (TextView) view.findViewById(R.id.tv_name); holder = holder2; break; } return holder; } @Override public int getItemViewType(int position) { if (position <= cartProInfos.size() -1) { return 0; } else { return 1; } } }
点击这里下载源码
相关文章推荐
- 使用RecyclerView结合jiaozivideoplayer去加载不同类型的布局
- Android Studio 使用RecyclerView加载不同样式布局
- 实现collectionview加载到tableview的tableFooterView上一起滑动(类似淘宝购物车)--通过添加观察者实现
- Android开发笔记之RecycleView加载不同item布局的实现
- Android高仿京东淘宝商品列表布局切换效果
- android控件使用---recycleview自定义上拉加载,和加载多个布局及加入动画
- 使用自定义的item、Adapter和AsyncTask、第三方开源框架PullToRefresh联合使用实现自定义的下拉列表(从网络加载图片显示在item中的ImageView)
- 源码推荐(03.04B):类似京东分类界面,ApplePay详细使用说明
- ViewDragHelper之拖动加载(类似淘宝)
- 淘宝京东购物车价格计算,商品店铺联动js
- Android使用addView动态加载布局文件
- Android RecyclerView加载不同布局简单实现
- cocos2d-x - 滚动列表(类似天天酷跑道具菜单)详解(CCScrollView的使用)
- IOS布局笔记三(使用不同父类的 view 进行约束)
- android中RecyclerView使用自定义的列表布局
- Android RecyclerView 加载更多数据 及 不同类型itemView的使用
- RecyclerView的使用(2)之多Item布局的加载
- 使用ViewSwitcher和ViewFlipper在不同布局中切换
- android 通过getViewTypeCount 和 getItemViewType实现item加载不同布局
- 使用ListView进行不同布局ItemView的显示