布局界面代码:
适配器代码只需更改列表视图适配器中的:
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_grid,null);
activity界面代码同前面的类似。
利用网格视图对商城界面进行优化。
需要更改的地方:
布局代码将滚动布局更改为下面的:
<GridView
android:id="@+id/gv_channel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:numColumns="2"/>
activity界面主要是对showGoods()方法的更改:
private void showGoods() {
//商品条目是一个线性布局,设置布局的宽度为屏幕的一半
int screenWidth = getResources().getDisplayMetrics().widthPixels;
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(screenWidth / 2, LinearLayout.LayoutParams.WRAP_CONTENT);
List<GoodsInfo> list = mDBHelper.queryAllGoodsInfo();
GoodsAdapter adapter = new GoodsAdapter(this,list,this);
gv_channel.setAdapter(adapter);
}
整体来说主要是对适配器进行相关的配置:
public class GoodsAdapter extends BaseAdapter {
private Context mContext;
private List<GoodsInfo> mGoodsList;
public GoodsAdapter(Context mContext, List<GoodsInfo> mGoodsList,AddCartListener mAddCartListener) {
this.mContext = mContext;
this.mGoodsList = mGoodsList;
this.mAddCartListener = mAddCartListener;
}
@Override
public int getCount() {
return mGoodsList.size();
}
@Override
public Object getItem(int position) {
return mGoodsList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null){
holder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_goods, null);
holder.iv_thumb = convertView.findViewById(R.id.iv_thumb);
holder.tv_name = convertView.findViewById(R.id.tv_name);
holder.tv_price = convertView.findViewById(R.id.tv_price);
holder.btn_add = convertView.findViewById(R.id.btn_add);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
GoodsInfo info = mGoodsList.get(position);
//给空间设置值
holder.iv_thumb.setImageURI(Uri.parse(info.picPath));
holder.tv_name.setText(info.name);
holder.tv_price.setText(String.valueOf(info.price));
holder.btn_add.setOnClickListener(v -> {
//addToCart(info.id,info.name);
mAddCartListener.addToCart(info.id,info.name);
});
holder.iv_thumb.setOnClickListener(v -> {
Intent intent = new Intent(mContext, ShoppingDetailActivity.class);
intent.putExtra("goods_id",info.id);
mContext.startActivity(intent);
});
return convertView;
}
private static class ViewHolder{
public ImageView iv_thumb;
public TextView tv_name;
public TextView tv_price;
public Button btn_add;
}
//声明一个加入购物车的监听器对象
private AddCartListener mAddCartListener;
//定义一个加入购物车的监听器接口
public interface AddCartListener{
void addToCart(int goods_id,String name);
}
}
在这个适配器中要特别注意:
因为要在适配器里面调用activity界面的addToCart()方法,为了使代码更规范,就在适配器中定义了一个接口,里面有一个抽象方法。在activity界面声明适配器对象时第三个参数传的是this,那么就表明该activity实现适配器结构中的那个抽象方法。那么,在适配器中,就可以通过声明的那个购物车的监听器的对象(mAddCartListener)调用该activity实现的接口中的addToCart()方法。注意,这个对象(mAddCartListener)是在构造方法中传递的。