有时候做项目,需要自己去实现网格样式的布局,但是又不能直接使用gridView或者recyclerview。因为他们也有局限性。
实现效果
private int columnNum = 2;
private static int imageWidth = 0;
private LinearLayout rowLinearlayout;
int totalDividerWidth =30*3;
/**
* 设置所有间隔距离,方便计算item的宽度
* @param totalDividerWidth
*/
public void setTotalDividerWidth(int totalDividerWidth) {
this.totalDividerWidth = totalDividerWidth;
}
/**
* 设置列数
*
* @param columnNum
*/
public void setColumnNum(int columnNum) {
this.columnNum = columnNum;
}
public <T> void initGridList(final List<T> listBeans,IUpdateUIListener iUpdateUIListener) throws IllegalAccessException {
if (columnNum==0){
throw new IllegalAccessException("请设置列数!");
}
this.iUpdateUIListener = iUpdateUIListener;
imageWidth = SystemUtils.getScreenWidth(getContext()) - totalDividerWidth;
imageWidth = imageWidth / columnNum;
removeAllViews();
for (int i = 0; i < listBeans.size(); i++) {
T t = listBeans.get(i);
View item = initItemView(t);
if (i % columnNum == 0) {
rowLinearlayout = new LinearLayout(getContext());
rowLinearlayout.setOrientation(HORIZONTAL);
LayoutParams layout = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layout.setMargins(30, 0, 0, 0);
rowLinearlayout.setLayoutParams(layout);
rowLinearlayout.addView(item);
addView(rowLinearlayout);
} else {
//添加间隔线
View view = new View(getContext());
view.setLayoutParams(new LayoutParams(30, ViewGroup.LayoutParams.MATCH_PARENT));
rowLinearlayout.addView(view);
rowLinearlayout.addView(item);
}
}
}
private <T>View initItemView(T t){
//获取子布局,设置宽度 高度
View item = LayoutInflater.from(getContext()).inflate(R.layout.category_goods_item, null);
LinearLayout.LayoutParams linearParams = new LinearLayout.LayoutParams(imageWidth, ViewGroup.LayoutParams.WRAP_CONTENT);
item.setLayoutParams(linearParams);
// 设置图片宽高 正方形
ImageView imageView = item.findViewById(R.id.image);
LinearLayout.LayoutParams layoutParams = (LayoutParams) imageView.getLayoutParams();
layoutParams.width = imageWidth;
layoutParams.height = imageWidth;
imageView.setBackgroundColor(Color.parseColor("#F0EBE9"));
imageView.setLayoutParams(layoutParams);
TextView title = item.findViewById(R.id.title);
TextView pTitle = item.findViewById(R.id.price);
iUpdateUIListener.setItem(t, imageView, title, pTitle);
return item;
}
IUpdateUIListener iUpdateUIListener;
public interface IUpdateUIListener<T> {
void setItem(T t, ImageView img, TextView title, TextView price);
}