最近在做项目的过程中,要用到
GridView,同时还得使用单选或多选功能,在网上搜过很多资源贴,但都不是我想要的效果,于是就自行设计了一种方案。什么都不说,先上个效果图^_^: Demo源代码下载:http://download.csdn.net/down/3435752/anndaming
首先需要构建一个ImageAdapter类,此类继承了BaseAdapter类,用于做GridView中资源的适配器,代码如下:
package com.demo;
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.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
public class ImageAdapter extends BaseAdapter{
private Context mContext; // 定义Context
private Vector<Integer> mImageIds = new Vector<Integer>(); // 定义一个向量作为图片源
private Vector<Boolean> mImage_bs = new Vector<Boolean>(); // 定义一个向量作为选中与否容器
private int lastPosition = -1; //记录上一次选中的图片位置,-1表示未选中任何图片
private boolean multiChoose; //表示当前适配器是否允许多选
public ImageAdapter(Context c, boolean isMulti){
mContext = c;
multiChoose = isMulti;
// 装入资源
mImageIds.add(R.drawable.item1);
mImageIds.add(R.drawable.item2);
mImageIds.add(R.drawable.item3);
mImageIds.add(R.drawable.item4);
mImageIds.add(R.drawable.item5);
for( int i=0; i<5; i++)
mImage_bs.add( false);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mImageIds.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) {
// TODO Auto-generated method stub
ImageView p_w_picpathView;
if (convertView == null)
{
p_w_picpathView = new ImageView(mContext); // 给ImageView设置资源
p_w_picpathView.setLayoutParams( new GridView.LayoutParams(50, 50)); // 设置布局图片
p_w_picpathView.setScaleType(ImageView.ScaleType.FIT_CENTER); // 设置显示比例类型
}
else
{
p_w_picpathView = (ImageView) convertView;
}
p_w_picpathView.setImageDrawable(makeBmp(mImageIds.elementAt(position),
mImage_bs.elementAt(position)));
return p_w_picpathView;
}
private LayerDrawable makeBmp( int id, boolean isChosen){
Bitmap mainBmp = ((BitmapDrawable)mContext.getResources().getDrawable(id)).getBitmap();
// 根据isChosen来选取对勾的图片
Bitmap seletedBmp;
if(isChosen == true)
seletedBmp = BitmapFactory.decodeResource(mContext.getResources(),
R.drawable.btncheck_yes);
else
seletedBmp = BitmapFactory.decodeResource(mContext.getResources(),
R.drawable.btncheck_no);
// 产生叠加图
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){
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(); //通知适配器进行更新
}
}
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.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
public class ImageAdapter extends BaseAdapter{
private Context mContext; // 定义Context
private Vector<Integer> mImageIds = new Vector<Integer>(); // 定义一个向量作为图片源
private Vector<Boolean> mImage_bs = new Vector<Boolean>(); // 定义一个向量作为选中与否容器
private int lastPosition = -1; //记录上一次选中的图片位置,-1表示未选中任何图片
private boolean multiChoose; //表示当前适配器是否允许多选
public ImageAdapter(Context c, boolean isMulti){
mContext = c;
multiChoose = isMulti;
// 装入资源
mImageIds.add(R.drawable.item1);
mImageIds.add(R.drawable.item2);
mImageIds.add(R.drawable.item3);
mImageIds.add(R.drawable.item4);
mImageIds.add(R.drawable.item5);
for( int i=0; i<5; i++)
mImage_bs.add( false);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mImageIds.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) {
// TODO Auto-generated method stub
ImageView p_w_picpathView;
if (convertView == null)
{
p_w_picpathView = new ImageView(mContext); // 给ImageView设置资源
p_w_picpathView.setLayoutParams( new GridView.LayoutParams(50, 50)); // 设置布局图片
p_w_picpathView.setScaleType(ImageView.ScaleType.FIT_CENTER); // 设置显示比例类型
}
else
{
p_w_picpathView = (ImageView) convertView;
}
p_w_picpathView.setImageDrawable(makeBmp(mImageIds.elementAt(position),
mImage_bs.elementAt(position)));
return p_w_picpathView;
}
private LayerDrawable makeBmp( int id, boolean isChosen){
Bitmap mainBmp = ((BitmapDrawable)mContext.getResources().getDrawable(id)).getBitmap();
// 根据isChosen来选取对勾的图片
Bitmap seletedBmp;
if(isChosen == true)
seletedBmp = BitmapFactory.decodeResource(mContext.getResources(),
R.drawable.btncheck_yes);
else
seletedBmp = BitmapFactory.decodeResource(mContext.getResources(),
R.drawable.btncheck_no);
// 产生叠加图
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){
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(); //通知适配器进行更新
}
}
接下是配置main.xml文件:
<?
xml
version
="1.0"
encoding
="utf-8"
?>
< LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent"
>
< LinearLayout
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:gravity ="center_horizontal" >
< TextView
android:text ="单选功能"
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:textSize ="40dp"
android:gravity ="center" />
< GridView android:id ="@+id/gridview_radio"
android:layout_width ="250dp"
android:layout_height ="150dp"
android:numColumns ="4"
android:padding ="10dp"
android:horizontalSpacing ="4dp"
android:verticalSpacing ="4dp"
android:gravity ="center" />
</ LinearLayout >
< LinearLayout
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:gravity ="center_horizontal" >
< TextView
android:text ="多选功能"
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:textSize ="40dp"
android:gravity ="center" />
< GridView android:id ="@+id/gridview_check"
android:layout_width ="250dp"
android:layout_height ="150dp"
android:numColumns ="4"
android:padding ="10dp"
android:horizontalSpacing ="4dp"
android:verticalSpacing ="4dp"
android:gravity ="center" />
</ LinearLayout >
</ LinearLayout >
< LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="fill_parent"
>
< LinearLayout
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:gravity ="center_horizontal" >
< TextView
android:text ="单选功能"
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:textSize ="40dp"
android:gravity ="center" />
< GridView android:id ="@+id/gridview_radio"
android:layout_width ="250dp"
android:layout_height ="150dp"
android:numColumns ="4"
android:padding ="10dp"
android:horizontalSpacing ="4dp"
android:verticalSpacing ="4dp"
android:gravity ="center" />
</ LinearLayout >
< LinearLayout
android:orientation ="vertical"
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:gravity ="center_horizontal" >
< TextView
android:text ="多选功能"
android:layout_width ="fill_parent"
android:layout_height ="wrap_content"
android:textSize ="40dp"
android:gravity ="center" />
< GridView android:id ="@+id/gridview_check"
android:layout_width ="250dp"
android:layout_height ="150dp"
android:numColumns ="4"
android:padding ="10dp"
android:horizontalSpacing ="4dp"
android:verticalSpacing ="4dp"
android:gravity ="center" />
</ LinearLayout >
</ LinearLayout >
最后写一个Activity作测试:
package com.demo;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.AdapterView.OnItemClickListener;
public class DemoActivity extends Activity {
GridView gridView_radio; //单选宫格
GridView gridView_check; //多选宫格
ImageAdapter ia_radio; //存储图片源的适配器(单选)
ImageAdapter ia_check; //存储图片源的适配器(多选)
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 单选的宫格
gridView_radio = (GridView) findViewById(R.id.gridview_radio);
ia_radio = new ImageAdapter( this, false);
gridView_radio.setAdapter(ia_radio);
// 设置点击监听
gridView_radio.setOnItemClickListener( new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
// TODO Auto-generated method stub
ia_radio.changeState(position);
}
});
// 多选的宫格
gridView_check = (GridView) findViewById(R.id.gridview_check);
ia_check = new ImageAdapter( this, true);
gridView_check.setAdapter(ia_check);
// 设置点击监听
gridView_check.setOnItemClickListener( new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
// TODO Auto-generated method stub
ia_check.changeState(position);
}
});
}
}
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.AdapterView.OnItemClickListener;
public class DemoActivity extends Activity {
GridView gridView_radio; //单选宫格
GridView gridView_check; //多选宫格
ImageAdapter ia_radio; //存储图片源的适配器(单选)
ImageAdapter ia_check; //存储图片源的适配器(多选)
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 单选的宫格
gridView_radio = (GridView) findViewById(R.id.gridview_radio);
ia_radio = new ImageAdapter( this, false);
gridView_radio.setAdapter(ia_radio);
// 设置点击监听
gridView_radio.setOnItemClickListener( new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
// TODO Auto-generated method stub
ia_radio.changeState(position);
}
});
// 多选的宫格
gridView_check = (GridView) findViewById(R.id.gridview_check);
ia_check = new ImageAdapter( this, true);
gridView_check.setAdapter(ia_check);
// 设置点击监听
gridView_check.setOnItemClickListener( new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
// TODO Auto-generated method stub
ia_check.changeState(position);
}
});
}
}
转载于:https://blog.51cto.com/whatandroid/836499