项目开发中须要使用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-S9-Day115——Flask Web框架基础

    01 今日内容概要 02 内容回顾 03 Flask框架:配置文件导入原理 04 Flask框架:配置文件使用 05 Flask框架:路由系统 06 Flask框架:请求和响应相关 07 示例:学生管 ...

  2. Socket 编程中,TCP 流的结束标志与粘包问题

    因为 TCP 本身是无边界的协议,因此它并没有结束标志,也无法分包. socket和文件不一样,从文件中读,读到末尾就到达流的结尾了,所以会返回-1或null,循环结束,但是socket是连接两个主机 ...

  3. rule.xml属性概念

    # tableRule <tableRule name="rule1"> <rule> <columns>id</columns> ...

  4. input框的限制(仅数字以及电话号码的限制)

    电话号码限制 <input  type="text"  id="phone" maxlength="11" onkeyup=" ...

  5. BZOJ 3771 Triple ——FFT

    直接暴力卷积+统计就可以了. 去重比较复杂. 其实也不复杂,抄吧! 反正AC了. #include <map> #include <cmath> #include <qu ...

  6. iframe+json

    import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.PropertyFilter; impor ...

  7. 使用 swagger组件给asp.net webapi文档生成

    1.名词解释 Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模 ...

  8. Bits

    先%SY... 课件链接 求1的个数 以32位整数为例子,最暴力的方法就是一位一位的数,但是这样太不优美... 以下是优美的方法... 这个问题其实就是二进制求和... 我们考虑分治的思想...每一次 ...

  9. 【BZOJ4542】大数(莫队)

    题意:给定一个N位的由[0..9]组成的数字串和质数P,有M次不强制在线的询问,每次询问区间[l,r]中模P意义下为0的子串个数 N,M<=2e5,P<=1e10 思路:一次A,本来还以为 ...

  10. 移动WEB前端开发资源的一些素材

    meta篇: <meta name="viewport" content="width=device-width,initial-scale=1.0,user-sc ...