您的位置:首页 > 其它

使用RecycleView加载不同的布局(类似淘宝京东购物车+推荐商品列表)

2017-05-25 16:12 525 查看
最近项目中加入了数据统计,也对应的需要在购物车底部加入推荐商品,类似淘宝京东的购物车,上部是购物车列表,下部是推荐商品,如图:



之前我们的购物车用的是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的代码

MainActivity

public 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;
}
}
}


点击这里下载源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息