zoukankan      html  css  js  c++  java
  • 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的话用上面的方法。

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

  • 相关阅读:
    简单的登录验证小程序_python
    远程执行命令_python
    远程执行本地脚本_linux
    反射_python
    ssh oa项目介绍
    返回上一级过程
    ssh框架开发crm(客户关系系统总结)
    struct相对路径,绝对路径
    <s:textfield>标签回显
    ssh框架整合
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7230893.html
Copyright © 2011-2022 走看看