看到有初学者有这样的需求:GridView实现图库预览图,多选模式下右上角打勾。(4.0图库的预览图多选时,多了个蓝色边框,其实是蓝色背景)
GridView在自己实际开发中也没用到过,就想试着实现下,写个demo供初学者参考,高手略过。
先来个效果图吧:
实现起来不复杂,就2个文件。 首先看看GridView继承关系:
我们知道ListView有单选模式和多选模式[.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE/AbsListView.CHOICE_MODE_MULTIPLE_MODAL)]
那么GridView也支持多选模式。
废话不多说,相信你也知道!贴代码吧
主布局文件:main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<GridView
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:columnWidth="75dip"
android:gravity="center"
android:horizontalSpacing="2dip"
android:numColumns="4"
android:verticalSpacing="2dip" />
</LinearLayout>
主Activity:HomeActivity
package com.xyz.gridview;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView.LayoutParams;
import android.widget.AbsListView.MultiChoiceModeListener;
import android.widget.BaseAdapter;
import android.widget.Checkable;
import android.widget.FrameLayout;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.TextView;
public class HomeActivity extends Activity implements MultiChoiceModeListener {
private GridView mGridView;
private GridAdapter mGridAdapter;
private TextView mActionText;
private static final int MENU_SELECT_ALL = 0;
private static final int MENU_UNSELECT_ALL = MENU_SELECT_ALL + 1;
private Map<Integer, Boolean> mSelectMap = new HashMap<Integer, Boolean>();
private int[] mImgIds = new int[] { R.drawable.img_1, R.drawable.img_2,
R.drawable.img_3, R.drawable.img_4, R.drawable.img_5,
R.drawable.img_6, R.drawable.img_7, R.drawable.img_8,
R.drawable.img_9, R.drawable.img_1, R.drawable.img_2,
R.drawable.img_3, R.drawable.img_4, R.drawable.img_5,
R.drawable.img_6, R.drawable.img_7 };
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mGridView = (GridView) findViewById(R.id.gridview);
mGridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
mGridAdapter = new GridAdapter(this);
mGridView.setAdapter(mGridAdapter);
mGridView.setMultiChoiceModeListener(this);
}
/** Override MultiChoiceModeListener start **/
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// TODO Auto-generated method stub
View v = LayoutInflater.from(this).inflate(R.layout.actionbar_layout,
null);
mActionText = (TextView) v.findViewById(R.id.action_text);
mActionText.setText(formatString(mGridView.getCheckedItemCount()));
mode.setCustomView(v);
getMenuInflater().inflate(R.menu.action_menu, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
// TODO Auto-generated method stub
menu.getItem(MENU_SELECT_ALL).setEnabled(
mGridView.getCheckedItemCount() != mGridView.getCount());
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.menu_select:
for (int i = 0; i < mGridView.getCount(); i++) {
mGridView.setItemChecked(i, true);
mSelectMap.put(i, true);
}
break;
case R.id.menu_unselect:
for (int i = 0; i < mGridView.getCount(); i++) {
mGridView.setItemChecked(i, false);
}
mSelectMap.clear();
break;
}
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
// TODO Auto-generated method stub
mGridAdapter.notifyDataSetChanged();
}
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position,
long id, boolean checked) {
// TODO Auto-generated method stub
mActionText.setText(formatString(mGridView.getCheckedItemCount()));
mSelectMap.put(position, checked);
mode.invalidate();
}
/** Override MultiChoiceModeListener end **/
private String formatString(int count) {
return String.format(getString(R.string.selection), count);
}
private class GridAdapter extends BaseAdapter {
private Context mContext;
public GridAdapter(Context ctx) {
mContext = ctx;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mImgIds.length;
}
@Override
public Integer getItem(int position) {
// TODO Auto-generated method stub
return Integer.valueOf(mImgIds[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
GridItem item;
if (convertView == null) {
item = new GridItem(mContext);
item.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
} else {
item = (GridItem) convertView;
}
item.setImgResId(getItem(position));
item.setChecked(mSelectMap.get(position) == null ? false
: mSelectMap.get(position));
return item;
}
}
}
上面用到 GridItem是自己封装的一个类:GridItem.java
package com.xyz.gridview;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Checkable;
import android.widget.ImageView;
import android.widget.RelativeLayout;
public class GridItem extends RelativeLayout implements Checkable {
private Context mContext;
private boolean mChecked;
private ImageView mImgView = null;
private ImageView mSelcetView = null;
public GridItem(Context context) {
this(context, null, 0);
}
public GridItem(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public GridItem(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
mContext = context;
LayoutInflater.from(mContext).inflate(R.layout.grid_item, this);
mImgView = (ImageView) findViewById(R.id.img_view);
mSelcetView = (ImageView) findViewById(R.id.select);
}
@Override
public void setChecked(boolean checked) {
// TODO Auto-generated method stub
mChecked = checked;
setBackgroundDrawable(checked ? getResources().getDrawable(
R.drawable.background) : null);
mSelcetView.setVisibility(checked ? View.VISIBLE : View.GONE);
}
@Override
public boolean isChecked() {
// TODO Auto-generated method stub
return mChecked;
}
@Override
public void toggle() {
// TODO Auto-generated method stub
setChecked(!mChecked);
}
public void setImgResId(int resId) {
if (mImgView != null) {
mImgView.setBackgroundResource(resId);
}
}
}
这个类引用的一个布局:grid_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageView
android:id="@+id/img_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitXY" />
<ImageView
android:id="@+id/select"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@drawable/icon_choice"
android:visibility="gone" />
</RelativeLayout>
就这么多啦。左上角的勾,就是控制 ImageView 显示与不显示的问题。
源码路径:http://download.csdn.net/detail/zhouyuanjing/4916510
~~完~~
分享到:
相关推荐
摘要:Java源码,Android,android源码,GridView android GridView实现图库预览图,在多选模式下右上角打勾,一个实用的Android实例源代码,Android编程开发必看的一些小示例。
我觉得这个Android源码挺实用的,为GridView组件添加多选和预览图片功能,在多选模式下右上角可以打勾,类似于现在的手机,长按列表项进入多选状态一样,使操作体验度上升,而且源代码实现方面并不是太复杂。
android gridview多选删除工程,支持同时选定多个item然后删除
在使用 GridView的时候,有时需要多选上面显示的类容,比如批量删除上面显示的图片,批量上传图片等。这个时候我们可以使用层叠图来实现,当用户点击item时候,会多一个打钩的图片出来,给用户提示,他选择了该项。
使用GridView 实现的漂亮的多选效果
android gridview嵌套RecyclerView并且RecyclerView中条目实现多选,并且获取选中数据等
android Gridview分页实现的一个小例子
GridView控件中实现跨页面多选
这个项目里面实现了两个功能一个是GridView点击右上角的叉号删除条目,另一个是贝塞尔曲线实现进度条
Android GridView 点击缩放图像
对gridview中的item进行多选,单选,2次点击取消选择的代码实现
Android 单行水平滑动效果,用HorizontalScrollView+GridView 来实现的,点击选中项后,退出再次进入应用,直接跳转到改选中项。
GridView实现多选,全选,反选功能
Android三级目录、ListView单选/GridView单选、ListView多选/GridView多选。选中后背景变色,字体变色。
GridView实现多张图片被选中的效果,一个简单的小demo
NULL 博文链接:https://haiyang08101.iteye.com/blog/2085309
gridview支持多选,代码保证运行通过,放心下载 对初学者比较有用 可以学到:gridview布局,显示 多选gridview,类似gallery的多选 actionbar的使用
主要为大家详细介绍了Android网格布局GridView实现漂亮的多选效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
基于GridView实现无縫单选或多选功能