项目开发中须要使用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. ios开发第一步--虚拟机安装MAC OS X

    暂时还没买Macbook,先用虚拟机练练手. 先说说准备工作,我是在win8下安装的,这个不是关键的,只要Vmware版本和MAC OS X版本确定就行了,win7下同样可以. 1.虚拟机Vmware ...

  2. plsql 编程基础

    分支 declare --声明变量 a ); b ); c ); begin --开始 a := '小明'; dbms_output.put_line(a); b :; c :; if b > ...

  3. sed处理大txt文件(1G) 比如替换某一串字符串,或者删除一行

    1.将11.sql文件中"prompt"替换为"--prompt",然后保存为111.sql文件 sed -e "s,prompt,--prompt, ...

  4. redis linux 集群

    redis集群:官方教程 步骤: 1.安装redis 2.修改配置文件redis.conf(集群所需基础配置) port 7000 cluster-enabled yes cluster-config ...

  5. 【转】Unity3D 场景切换与持久化简单数据储存(PlayerPrefs类)

    本篇文章主要介绍了"Unity3D 场景切换与持久化简单数据储存(PlayerPrefs类)",主要涉及到Unity3D 场景切换与持久化简单数据储存(PlayerPrefs类)方 ...

  6. linux系统——fread()与read()函数族区别

    fread与read区别: 1,fread是带缓冲的,read不带缓冲. 2,fopen是标准c里定义的,open是POSIX中定义的. 3,fread可以读一个结构.read在linux/unix中 ...

  7. 论文笔记《Fully Convolutional Networks for Semantic Segmentation》

    一.Abstract 提出了一种end-to-end的做semantic segmentation的方法,也就是FCN,是我个人觉得非常厉害的一个方法. 二.亮点 1.提出了全卷积网络的概念,将Ale ...

  8. 合理使用webpack提高开发效率

    虽然公司有提供现成的脚手架工具,但是作为开发人员懂得必要的相关知识还是很重要的.这样有利于提高我们的开发效率,优化我们的代码. 关于npm scripts 什么是npm scripts npm 允许在 ...

  9. 支线剧情(bzoj 3876)

    Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现 ...

  10. linux之tee

    tee命令 tee把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中 如果想看到输出的同时,把输出也同时拷入一个文件,这个命令很合适 格式:tee -a file -a 表示文件追加到末尾 ...