Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> gridview多選單選的實現

gridview多選單選的實現

編輯:關於Android編程

這篇博客呢主要是寫gridview的多選以及單選的功能,並且獲取選中的值。

首先呢,我做一下聲明,這個小程序呢是我借鑒某位大神的部分代碼,按照自己的需求重新編寫了一下。本來想注上鏈接,可是應該是之前看的,所以實在找不到了。

下面是我要實現的功能。這個布局裡面有兩個gridview。紅色的球可以進行多選,藍色的球只能是單選。item的布局裡面放了三個imageview,分別存放灰色,紅色和藍色的圓形圖片,藍色和紅色的圖片設置gone的屬性。還有一個textView就是顯示圓圈裡的數字。

 

\

選球之後點擊下一步,就會顯示下面的頁面,上面顯示的數字就是我之前選種的號碼。

\

下面的我給大家貼一下核心的代碼

/**
* 繼承MultiChoiceModeListener接口實現gridview的單選和多選,並獲取相應的數據*/
public class HomeActivity extends Activity implements MultiChoiceModeListener {


private GridView mGridView_red; //紅球的gridview
private GridAdapter mGridAdapterRed; //紅球的適配器
private GridView gridview_bule; //藍球的gridview
private GridAdapter mGridAdapterBlue; //藍球的適配器
private Button button; //下一步按鈕
private Map mSelectMapRed = new HashMap(); //存放選擇紅球的數字的集合
private Map mSelectMapBlue = new HashMap(); //存放選擇藍球的數字的集合


Map mImgIds_red = new HashMap(); //存放紅球的集合
Map mImgIds_blue = new HashMap(); //存放藍球的集合
/** 程序從此開始運行 */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//顯示33個紅球區域的圖片
for (int i = 0; i < 33; i++) {
mImgIds_red.put(i,R.drawable.ball);
}

//顯示8個藍球區域的圖片
for (int i = 0; i < 8; i++) {
mImgIds_blue.put(i,R.drawable.ball);
}
mGridView_red = (GridView) findViewById(R.id.gridview_red); //初始化紅球的gridview
button = (Button) findViewById(R.id.button); //初始化下一步按鈕
mGridView_red.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE);// 設置為多選模式
mGridAdapterRed = new GridAdapter(this); //為紅球new一個適配器
mGridView_red.setAdapter(mGridAdapterRed);// 紅球數據適配
mGridView_red.setMultiChoiceModeListener(this);// 設置紅球多選模式監聽器

gridview_bule = (GridView)findViewById(R.id.gridview_bule); //初始化藍球的gridview
gridview_bule.setChoiceMode(GridView.CHOICE_MODE_SINGLE);// 設置為多選模式
mGridAdapterBlue = new GridAdapter(this,"blue"); //為藍球new一個適配器並且傳入藍球的標識
gridview_bule.setAdapter(mGridAdapterBlue);// 數據適配
gridview_bule.setMultiChoiceModeListener(this);//設置藍球單選模式監聽器


//監聽按鈕
button.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
String select_red_ball = ""; //紅球的數字
String select_blue_ball = ""; //藍球的數字
List selectednum_red = new ArrayList(); //存放選中紅球數字的list
SparseBooleanArray selectedposition_red;
selectedposition_red = mGridView_red.getCheckedItemPositions();
for (int i = 0; i < mImgIds_red.size(); i++) {
if(selectedposition_red.get(i)){
selectednum_red.add(i+1);
}
}
for (int i = 0; i < selectednum_red.size(); i++) {
select_red_ball=select_red_ball+selectednum_red.get(i)+" ";
}
List selectednum_blue = new ArrayList(); //存放選中藍球的數字
SparseBooleanArray selectedposition_blue;
selectedposition_blue = gridview_bule.getCheckedItemPositions();
for (int i = 0; i < mImgIds_blue.size(); i++) {
if(selectedposition_blue.get(i)){
selectednum_blue.add(i+1);
}
}
for (int i = 0; i < selectednum_blue.size(); i++) {
select_blue_ball=""+selectednum_blue.get(i)+" ";
}
//跳轉到下一個頁面,並顯示數據
Intent intent = new Intent();
intent.setClass(HomeActivity.this, ShowNumberActivity.class);
intent.putExtra("select", select_blue_ball+select_red_ball); //傳數據
startActivity(intent);
}
});
}


@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
return true;
}


@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return true;
}


@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return true;
}


@Override
public void onDestroyActionMode(ActionMode mode) {
mGridAdapterRed.notifyDataSetChanged();
}


@Override
public void onItemCheckedStateChanged(ActionMode mode, int position,
long id, boolean checked) {
mSelectMapRed.put(position, checked);/* 放入選中的集合中 */
mode.invalidate();
}




//適配器
private class GridAdapter extends BaseAdapter {


private Context mContext;
private String mType = "red";


public GridAdapter(Context ctx) {
mContext = ctx;
}
public GridAdapter(Context ctx,String type) {
mContext = ctx;
mType = type;
}
@Override
public int getCount() {
return (mType.equals("red") ? mImgIds_red:mImgIds_blue).size();
}


@Override
public Integer getItem(int position) {
return Integer.valueOf((mType.equals("red")?mImgIds_red:mImgIds_blue).get(position).toString());
}


@Override
public long getItemId(int position) {
return position;
}


@Override
/* 得到View */
public View getView(int position, View convertView, ViewGroup parent) {
GridItem item;
if (mType.equals("red")) {
if (convertView == null) {
item = new GridItem(mContext);
item.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
} else {
item = (GridItem) convertView;
}
item.setImgResId(getItem(position));
item.setItemText(String.valueOf(position+1));
item.setChecked(mSelectMapRed.get(position) == null ? false
: mSelectMapRed.get(position));
}else {
if (convertView == null) {
item = new GridItem(mContext,"blue");
item.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT));
} else {
item = (GridItem) convertView;
}
item.setImgResId(getItem(position));
item.setItemText(String.valueOf(position+1));
item.setChecked(mSelectMapBlue.get(position) == null ? false
: mSelectMapBlue.get(position));
}

return item;
}
}


}

還有一個設置點擊圖片的效果的自定義view

/**
* 自定義View繼承Checable接口*/
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Checkable;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;


public class GridItem extends RelativeLayout implements Checkable {


private Context mContext;
private boolean mChecked;//判斷該選項是否被選上的標志量
private ImageView mImgView = null; //點擊前的圖片
private ImageView mSecletView = null; //點擊紅球的圖片
private ImageView mSecletBlue = null; //點擊籃球的圖片
private TextView mItemText = null; //顯示的數字
private String mType = "red"; //標識是籃球還是紅球的點擊

public GridItem(Context context) {
this(context, null, 0);
}
public GridItem(Context context,String mType) {
this(context, null, 0);
this.mType = mType;
}


public GridItem(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}


public GridItem(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
LayoutInflater.from(mContext).inflate(R.layout.grid_item, this); //初始化item布局
mImgView = (ImageView) findViewById(R.id.img_view); //初始化原始布局id
mSecletView = (ImageView) findViewById(R.id.select_red); //紅球的id
mItemText=(TextView) findViewById(R.id.itemText); //號碼的id
mSecletBlue = (ImageView)findViewById(R.id.select_blue); //籃球的id
}

@Override
public void setChecked(boolean checked) {
// TODO Auto-generated method stub
mChecked = checked;
if (mType.equals("red")) {
mSecletView.setVisibility(checked ? View.VISIBLE : View.GONE);//選上了圖片變成紅色


}else {
mSecletBlue.setVisibility(checked ? View.VISIBLE : View.GONE);//選上了圖片變成藍色


}
}




@Override
public boolean isChecked() {
return mChecked;
}


@Override
public void toggle() {
setChecked(!mChecked);
}


public void setImgResId(int resId) {
if (mImgView != null) {
mImgView.setBackgroundResource(resId);//設置背景
}
}


public void setItemText(String itemText) {
mItemText.setText(itemText); //設置文字
}


}

這樣呢我們就能夠做出這樣的效果了。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved