GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本号系统解决方式
项目开发中须要使用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)不兼容低版本号系统解决方式的更多相关文章
- 在javascript中的浏览器兼容问题以及兼容浏览器汇总(默认事件,阻止冒泡,事件监听。。。)以及解决方式详解
在javascript中常见的浏览器兼容问题,以及解决方式. 在前端工作当中我们遵循这样的原则:渐进增强和优雅降级 渐进增强(progressive enhancement): 针对低版本浏览器进 ...
- android 在使用ViewAnimationUtils.createCircularReveal()无法兼容低版本的情况下,另行实现圆形scale动画
ViewAnimationUtils.createCircularReveal()的简介: ViewAnimationUtils.createCircularReveal()是安卓5.0才引入的,快速 ...
- [转]AppCompat 22.1,Goole暴走,MD全面兼容低版本
AppCompat 22.1,Goole暴走,MD全面兼容低版本 分类: Android2015-04-24 09:48 1354人阅读 评论(0) 收藏 举报 android 目录(?)[+] ...
- 模拟实现兼容低版本IE浏览器的原生bind()函数功能
模拟实现兼容低版本IE浏览器的原生bind()函数功能: 代码如下: if(!Function.prototype.bind){ Function.prototype.bind=function( ...
- universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法
在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而且加载过的图片再次上翻后依然会重复加载(显示设置好的加载中图片) 最近在使 ...
- Android ScrollView嵌套GridView导致GridView只显示一行item
Android ScrollView嵌套GridView导致GridView只显示一行item Android ScrollView在嵌套GridView时候,会导致一个问题发生:GridView只显 ...
- ScrollView嵌套GridView,GridView显示不全
最近开发有个需求是以A-Z的方式区分全国城市(搜索功能),并实现字母索引的功能(有点类似微信,不过比较坑的是用的是GridView, 并且GridView上面还有几个LinearLayout). 详细 ...
- fragment基础 fragment生命周期 兼容低版本
fragment入门 ① 创建一个类继承Fragment 重写oncreateView方法 public class FirstFragment extends Fragment { @Overrid ...
- Vue2+Webpack+ES6 兼容低版本浏览器(IE9)解决方案
Vue2+Webpack+ES6 兼容低版本浏览器(IE9)解决方案 解决方式:安装 "babel-polyfill" 即可. 命令:npm install --save-dev ...
随机推荐
- 博客内插入bilibili视频
原理 使用iframe标签,更改其中src的aid和cid,使其对应要插入的视频,即可在文章内插入bilibili视频 获取cid aid即为视频的av号,cid有两种获取方式,一是通过bilibil ...
- Python之基于socket和select模块实现IO多路复用
'''IO指的是输入输出,一部分指的是文件操作,还有一部分网络传输操作,例如soekct就是其中之一:多路复用指的是利用一种机制,同时使用多个IO,例如同时监听多个文件句柄(socket对象一旦传送或 ...
- 【bzoj3834】[Poi2014]Solar Panels 数论
题目描述 Having decided to invest in renewable energy, Byteasar started a solar panels factory. It appea ...
- ZigBee学习二 LED点对点通信
ZigBee学习二 LED点对点通信 终端上电后,自动连接协调器进行组网,成功后,开始发送LED字符数据.当协调器接收到数据后,终端和协调器的LED1都开始闪烁. 工程搭建和文件添加 步骤这里就省了. ...
- BZOJ4872 [六省联考2017]分手是祝愿 【期望dp】
题目 Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为 从 1 ...
- 旅行商(sale)
旅行商(sale) 题目描述 camp国有n座城市,由1,2,-,n编号.城市由n–1条双向道路相连.任意两个城市之间存在唯一的道路连通.有m个旅行商,第i个旅行商会从城市ai旅行到城市bi,贩卖ci ...
- 【HDU 1711 Number Sequence】
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission ...
- git 使用报错记录
错误一:git fatal: unable to write new index file主要原因就是服务器磁盘空间不够导致的,增加服务器空间就OK了在百度上面搜索没得到什么有效信息,在gooogle ...
- 序列操作(bzoj 1858)
Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 ...
- hihocoder #1419 : 后缀数组四·重复旋律4
#1419 : 后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构 ...