项目开发中须要使用GridView批处理操作,多项选择。

可是GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本号。

找解决方式。查看android sdk提供的demo里介绍的GridView多项选择的方法

public class Grid3 extends Activity {

    GridView mGrid;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); loadApps(); setContentView(R.layout.grid_1);
mGrid = (GridView) findViewById(R.id.myGrid);
mGrid.setAdapter(new AppsAdapter());
mGrid.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
mGrid.setMultiChoiceModeListener(new MultiChoiceModeListener());
} private List<ResolveInfo> mApps; private void loadApps() {
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); mApps = getPackageManager().queryIntentActivities(mainIntent, 0);
} public class AppsAdapter extends BaseAdapter {
public AppsAdapter() {
} public View getView(int position, View convertView, ViewGroup parent) {
CheckableLayout l;
ImageView i; if (convertView == null) {
i = new ImageView(Grid3.this);
i.setScaleType(ImageView.ScaleType.FIT_CENTER);
i.setLayoutParams(new ViewGroup.LayoutParams(50, 50));
l = new CheckableLayout(Grid3.this);
l.setLayoutParams(new GridView.LayoutParams(GridView.LayoutParams.WRAP_CONTENT,
GridView.LayoutParams.WRAP_CONTENT));
l.addView(i);
} else {
l = (CheckableLayout) convertView;
i = (ImageView) l.getChildAt(0);
} ResolveInfo info = mApps.get(position);
i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager())); return l;
} public final int getCount() {
return mApps.size();
} public final Object getItem(int position) {
return mApps.get(position);
} public final long getItemId(int position) {
return position;
}
} public class CheckableLayout extends FrameLayout implements Checkable {
private boolean mChecked; public CheckableLayout(Context context) {
super(context);
} public void setChecked(boolean checked) {
mChecked = checked;
setBackgroundDrawable(checked ?
getResources().getDrawable(R.drawable.blue)
: null);
} public boolean isChecked() {
return mChecked;
} public void toggle() {
setChecked(!mChecked);
} } public class MultiChoiceModeListener implements GridView.MultiChoiceModeListener {
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.setTitle("Select Items");
mode.setSubtitle("One item selected");
return true;
} public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return true;
} public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return true;
} public void onDestroyActionMode(ActionMode mode) {
} public void onItemCheckedStateChanged(ActionMode mode, int position, long id,
boolean checked) {
int selectCount = mGrid.getCheckedItemCount();
switch (selectCount) {
case 1:
mode.setSubtitle("One item selected");
break;
default:
mode.setSubtitle("" + selectCount + " items selected");
break;
}
} }
}

实现了implements Checkable,然后能够设置GridView的多项选择,可是无法兼容低版本号

后来自己琢磨发现了解决兼容低版本号的方法。见代码

给GridView设置的Adapter

List<CodeGoodsListEntiy> goods = new ArrayList<CodeGoodsListEntiy>();
public class CollectionAdapter extends BaseAdapter{ @Override
public int getCount() {
// TODO Auto-generated method stub
return goods.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;
} public void addDataList(List<CodeGoodsListEntiy> goodsList){
goods.addAll(goodsList);
} public void removeAllList(){
goods.removeAll(goods);
} public void removeData(CodeGoodsListEntiy entity){
goods.remove(entity);
} public List<CodeGoodsListEntiy> getList(){
return goods;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
CheckableLayout layout = null;
CodeGoodsListEntiy good = goods.get(position);
if(convertView==null){
layout = new CheckableLayout();
convertView = inflater.inflate(R.layout.mycollection_griditem, null);
layout.imgviewlayout = (RelativeLayout) convertView.findViewById(R.id.imgviewlayout);
layout.iv = (ImageView) convertView.findViewById(R.id.iv);
layout.price = (TextView) convertView
.findViewById(R.id.price);
layout.title = (TextView) convertView.findViewById(R.id.title);
layout.sellnums = (TextView) convertView.findViewById(R.id.sells);
layout.item_selectbtn = (ImageView) convertView.findViewById(R.id.item_selectbtn);
layout.item_topview = (ImageView) convertView.findViewById(R.id.item_topview);
convertView.setTag(layout);
}else{
layout = (CheckableLayout) convertView.getTag();
} layout.price.setText("¥"+good.getSalePrice());
layout.title.setText(good.getTitle());
layout.sellnums.setText("月销量"+good.getSellNums());
layout.imgviewlayout.getLayoutParams().height = (SettingUtil.getDisplaywidthPixels() - SettingUtil
.dip2px(8)) / 2;
layout.iv.getLayoutParams().height = (SettingUtil.getDisplaywidthPixels() - SettingUtil
.dip2px(10)) / 2;
App.imageLoader.displayImage(good.getMainImg(), layout.iv, options, new SimpleImageLoadingListener());
if(editModel){
if(selecteditem.contains(position)){
layout.setChecked(true);
}else{
layout.setChecked(false);
}
}else{
layout.item_selectbtn.setVisibility(View.GONE);
layout.item_topview.setVisibility(View.GONE);
}
return convertView;
} } class CheckableLayout implements Checkable{ View convertView;
ImageView item_selectbtn;
ImageView item_topview;
ImageView iv;
TextView price;
TextView title;
TextView sellnums;
RelativeLayout imgviewlayout; private boolean mChecked = false; public CheckableLayout() {
// TODO Auto-generated constructor stub
} @Override
public void setChecked(boolean checked) {
// TODO Auto-generated method stub
mChecked = checked;
if(item_topview!=null){
if(mChecked){
item_topview.setVisibility(View.GONE);
}else{
item_topview.setVisibility(View.VISIBLE);
}
}
if(item_selectbtn!=null){
if(mChecked){
item_selectbtn.setVisibility(View.VISIBLE);
}else{
item_selectbtn.setVisibility(View.GONE);
}
}
} @Override
public boolean isChecked() {
// TODO Auto-generated method stub
return mChecked;
} @Override
public void toggle() {
// TODO Auto-generated method stub
setChecked(!mChecked);
} }

事实上这里class CheckableLayout implements Checkable类似于一般的Adapter里的ViewHolder的类一样的。

然后给GridView设置的ItemClickListener的方法

private OnItemClickListener onlvItemClick = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
if(editModel){
CheckableLayout holder = (CheckableLayout) arg1.getTag();
if(selecteditem.contains(arg2)){
selecteditem.remove((Integer)arg2);
holder.setChecked(false);
}else{
selecteditem.add(arg2);
holder.setChecked(true);
}
}else{
ProDetailActivity.launch(MyCollectionActivity.this, goods
.get(arg2).getItemId());
}
}
};

事实上这里非常关键的就是通过传来的View得到那个ViewHolder类

CheckableLayout holder = (CheckableLayout) arg1.getTag();

或者用以下的代码

View view = gv.getChildAt(arg2 - gv.getFirstVisiblePosition());

CheckableLayout holder = (CheckableLayout) view.getTag();

这里一般的GridView或者ListView的BaseAdapter里复用了convertView的话,GridView.getChildCount的数量少于BaseAdapter.getCount数量。

仅仅会显示屏幕显示出的数量,这是BaseAdapter用ViewHolder复用convertView的特点。

所以假设要获取到单个itemview的话用上面的方法。

说到这里吧。非常多项目代码涉及到商业性,有问题能够交流。这样的方法须要注意细节就是了。

GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本号系统解决方式的更多相关文章

  1. 在javascript中的浏览器兼容问题以及兼容浏览器汇总(默认事件,阻止冒泡,事件监听。。。)以及解决方式详解

    在javascript中常见的浏览器兼容问题,以及解决方式. 在前端工作当中我们遵循这样的原则:渐进增强和优雅降级   渐进增强(progressive enhancement): 针对低版本浏览器进 ...

  2. android 在使用ViewAnimationUtils.createCircularReveal()无法兼容低版本的情况下,另行实现圆形scale动画

    ViewAnimationUtils.createCircularReveal()的简介: ViewAnimationUtils.createCircularReveal()是安卓5.0才引入的,快速 ...

  3. [转]AppCompat 22.1,Goole暴走,MD全面兼容低版本

    AppCompat 22.1,Goole暴走,MD全面兼容低版本 分类: Android2015-04-24 09:48 1354人阅读 评论(0) 收藏 举报 android   目录(?)[+] ...

  4. 模拟实现兼容低版本IE浏览器的原生bind()函数功能

    模拟实现兼容低版本IE浏览器的原生bind()函数功能: 代码如下: if(!Function.prototype.bind){   Function.prototype.bind=function( ...

  5. universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法

    在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而且加载过的图片再次上翻后依然会重复加载(显示设置好的加载中图片) 最近在使 ...

  6. Android ScrollView嵌套GridView导致GridView只显示一行item

    Android ScrollView嵌套GridView导致GridView只显示一行item Android ScrollView在嵌套GridView时候,会导致一个问题发生:GridView只显 ...

  7. ScrollView嵌套GridView,GridView显示不全

    最近开发有个需求是以A-Z的方式区分全国城市(搜索功能),并实现字母索引的功能(有点类似微信,不过比较坑的是用的是GridView, 并且GridView上面还有几个LinearLayout). 详细 ...

  8. fragment基础 fragment生命周期 兼容低版本

    fragment入门 ① 创建一个类继承Fragment 重写oncreateView方法 public class FirstFragment extends Fragment { @Overrid ...

  9. Vue2+Webpack+ES6 兼容低版本浏览器(IE9)解决方案

    Vue2+Webpack+ES6 兼容低版本浏览器(IE9)解决方案 解决方式:安装 "babel-polyfill" 即可. 命令:npm install --save-dev ...

随机推荐

  1. Python 拓展之特殊函数(lambda 函数,map 函数,filter 函数,reduce 函数)

    写在之前 今天给大家介绍几个比较特殊的函数,他们具有函数式编程的特点,有人将它们视为 Python 可进行 "函数式编程" 的见证,至于什么是函数式编程,不是本篇文章的重点,感兴趣 ...

  2. camelot工具进行pdf表格解析重建

    camelot内置生成html文件的方法,但表格数据转化成pandas.dataframe的过程中,丢失了跨行跨列的结构信息,故生成html的表格无跨行跨列结构. 于是我在输出部分选择直接手写html ...

  3. [oldboy-django][2深入django]ORM操作

    推荐学习博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html 需求: 汇总django orm操作,代替原生mysql语句来操作数据库:里面内 ...

  4. [python][django学习篇][5]选择数据库版本(默认SQLite3) 与操作数据库

    推荐学习博客:http://zmrenwu.com/post/6/ 选择数据库版本(SQLite3) 如果想选择MySQL等版本数据库,请先安装MySQL并且安装python mysql驱动,这里不做 ...

  5. Mysql升级ORACLE 记录

    自增主键问题 php和mysql不写主键mysql可以自动生成主键; 想用pdo批量向mysql插入数据只能每条一个pdostarment->execute 看tp5.1的源码提供的方案是 IN ...

  6. 习题:Dual Matrices(思路题/分治)

    tyvj1764 描述一个N行M列的二维矩阵,矩阵的每个位置上是一个绝对值不超过1000的整数.你需要找到两个不相交的A*B的矩形,使得这两个矩形包含的元素之和尽量大.注:A*B的矩形指连续的A行.B ...

  7. eclipse中 tomcat首页server Locations变灰无法编辑

    解决办法: 1.首先将Servers中部署的工程全部清空 2.然后对Tomcat v8.0 Server at localhost,点右键进行clean处理,再重新双击打开server服务即可.

  8. ICPC World Finals 2018 Problem H Single Cut of Failure

    题目链接 题解视频 题解文档 解法概要: 问题可以转化为 考虑一个长为 $2n$ 的数组 $A$,$1$ 到 $n$ 这 $n$ 个整数每个恰在 $A$ 中出现 $2$ 次.判断是否存在一个长为 $n ...

  9. BZOJ3524 [Poi2014]Couriers 【主席树】

    题目 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入格式 第一 ...

  10. 洛谷P1816 忠诚

    P1816 忠诚 569通过 1.5K提交 题目提供者该用户不存在 标签云端 难度普及+/提高 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 主席树的常数貌似大于线段树… TL ...