GridView中item 单选、多选

来源:互联网 发布:macbook怎么下载淘宝 编辑:程序博客网 时间:2024/05/29 19:04
效果如图:

单选

多选

GriaView的适配器:

import java.util.List;
import java.util.Map;
import java.util.Vector;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class GridRadioAdapter extends BaseAdapter{
private Context mContext; // 定义Context
// private Vector<Integer> mImageIds = new Vector<Integer>(); // 定义一个向量作为图片源
private Vector<Boolean> mImage_bs = new Vector<Boolean>(); // 定义一个向量作为选中与否容器
private List<Map<String,Object>> gridTextList;

private int lastPosition = -1; //记录上一次选中的图片位置,-1表示未选中任何图片
private boolean multiChoose; //表示当前适配器是否允许多选
private int flag = 0;//0:套餐 1:首月资费 2:业务包 3:优惠

private LayoutInflater inflate;

/**
*
* @param c 上下文
* @param gridTextList 填充数据
* @param index 默认选中位置 -1为什么都不选
* @param isMulti 是否为多选 true多选,false单选
* @param flag 0:套餐,1:首月资费,2:可选业务包,3:优惠
*/
public GridRadioAdapter(Context c,List<Map<String,Object>> gridTextList,int index, boolean isMulti,int flag){
mContext = c;
multiChoose = isMulti;
this.gridTextList = gridTextList;
inflate = LayoutInflater.from(mContext);
lastPosition = index;
this.flag = flag;

// 装入资源
for(int i = 0 ;i<gridTextList.size();i++){
if(i == lastPosition){
mImage_bs.add(true);
}else{
mImage_bs.add(false);
}
}
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return gridTextList.size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder ;
if (convertView == null)
{
holder = new ViewHolder();
convertView = inflate.inflate(R.layout.grid_item, null);
holder.grid_iv = (ImageView) convertView.findViewById(R.id.img_checked);
holder.grid_tv = (TextView) convertView.findViewById(R.id.grid_text);
holder.grid_ll = (RelativeLayout) convertView.findViewById(R.id.grid_relative);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}

if(mImage_bs.elementAt(position)){
holder.grid_iv.setVisibility(View.VISIBLE);
holder.grid_ll.setBackgroundResource(R.drawable.new_add_item_bg_2);
}else{
holder.grid_iv.setVisibility(View.GONE);
holder.grid_ll.setBackgroundResource(R.drawable.new_add_item_bg_1);
}
String obj = "";
switch(flag){
case 0:
obj = gridTextList.get(position).get("PACKAGE_NAME").toString();
break;
case 1:
obj = gridTextList.get(position).get("FIRSTMONPRICE_NAME").toString();
break;
case 2:
obj = gridTextList.get(position).get("BUSINESSPACKAGE_NAME").toString();
break;
case 3:
obj = gridTextList.get(position).get("PROMOTIONS_NAME").toString();
break;
}

holder.grid_tv.setText(obj);

return convertView;
}



private LayerDrawable makeBmp(int id, boolean isChosen){
Bitmap mainBmp = ((BitmapDrawable)mContext.getResources().getDrawable(id)).getBitmap();

// 根据isChosen来选取对勾的图片
Bitmap seletedBmp = null;
if(isChosen == true)
seletedBmp = BitmapFactory.decodeResource(mContext.getResources(),
R.drawable.checkbox_checked);
else
seletedBmp = BitmapFactory.decodeResource(mContext.getResources(),
R.drawable.checkbox_unchecked);

// 产生叠加图
Drawable[] array = new Drawable[2];
array[0] = new BitmapDrawable(mainBmp);
array[1] = new BitmapDrawable(seletedBmp);
LayerDrawable la = new LayerDrawable(array);
la.setLayerInset(0, 0, 0, 0, 0);
la.setLayerInset(1, 0, -5, 60, 45 );

return la; //返回叠加后的图
}

// 修改选中的状态
public void changeState(int position){
// 多选时
if(multiChoose == true){
if(position == gridTextList.size()-1){//当选择的是最后一项时,取消 其他选中状态
// mImage_bs.setElementAt(true,position);
for(int i = 0;i<gridTextList.size()-1;i++){
mImage_bs.setElementAt(false,i);
}
}else{

mImage_bs.setElementAt(false, gridTextList.size()-1);
}
mImage_bs.setElementAt(!mImage_bs.elementAt(position), position); //直接取反即可
}
// 单选时
else{
if(lastPosition != -1)
mImage_bs.setElementAt(false, lastPosition); //取消上一次的选中状态
mImage_bs.setElementAt(!mImage_bs.elementAt(position), position); //直接取反即可
lastPosition = position; //记录本次选中的位置
}
notifyDataSetChanged(); //通知适配器进行更新
}

/**
* 返回选中与否容器
* @author
*/
public Vector<Boolean> getSelectedVector(){
return mImage_bs;

}

class ViewHolder{
public TextView grid_tv;
public ImageView grid_iv;
public RelativeLayout grid_ll;
}
}
注意:由于我们的项目对多选要求是这样的:当选择最后一项时,其他项都不可选;当选择的是其他项时,最后一项不可选,其他可多选。
如果是普通多选的话,只要changeState方法中当 multiChoose为true时,设置取反即可:
public void changeState(int position){
// 多选时
if(multiChoose == true){
mImage_bs.setElementAt(!mImage_bs.elementAt(position), position); //直接取反即可
}
}


activity调用:
busPackAdpater = new GridRadioAdapter(BusinessAddActivity.this,businessPackContentList,businessPackContentList.size()-1,false,2);
business_gv.setAdapter(busPackAdpater);