Gridview 單選效果,在androidapp中實現非常頻繁,我這里提供我的一種思路,這是我的思維導圖:
怎么樣將這樣的思維導圖翻譯成java代碼了,請看下面的代碼了:
// 電子產品的圖片列表信息 static class ConfigInfo { static final int[] img = { R.drawable.electron_dvdplay, R.drawable.electron_toudaishishexianji, R.drawable.electron_miniyinxiang, R.drawable.electron_weidan_camera }; } static class ConfigInfos{ static final int[] imgs = { R.drawable.electron_dedplat_select, R.drawable.electron_toudaishishexiangji_select, R.drawable.electron_miniyinxiang, R.drawable.electron_weidan_select }; } // GridView 設配數據 class Gridadapter extends BaseAdapter { List<Electronic> listbean; Context context; private int lastPosition = -1; // 記錄上一次選中的圖片位置,-1表示未選中任何圖片 private boolean multiChoose; // 表示當前適配器是否允許多選 private List<Boolean> mImage_bs = new ArrayList<Boolean>(); // 定義一個向量作為選中與否容器 private List<Integer> mSelectItems = new ArrayList<Integer>(); public Gridadapter(Context context, List<Electronic> listbean, Boolean isMulti) { this.context = context; this.listbean = listbean; multiChoose = isMulti; for (int i = 0; i < listbean.size(); i++) mImage_bs.add(false); } // // private LayerDrawable makeBmp(Electronic id, boolean isChosen) { // Bitmap mainBmp = ((BitmapDrawable) context.getResources() // .getDrawable(id.getIcon())).getBitmap(); // // // 根據isChosen來選取對勾的圖片 // Bitmap seletedBmp; // if (isChosen == true) // seletedBmp = BitmapFactory.decodeResource( // context.getResources(), R.drawable.gridview_chech_bg1); // else // seletedBmp = BitmapFactory.decodeResource( // context.getResources(), // R.drawable.electron_shuma_camera); // // // 產生疊加圖 // Drawable[] array = new Drawable[2]; // array[0] = new BitmapDrawable(mainBmp); // array[1] = new BitmapDrawable(seletedBmp); // LayerDrawable la = new LayerDrawable(array); // la.setLayerInset(50, 50, 50, 50, 50); // la.setLayerInset(1, 10, -5, 60, 45); // // return la; // 返回疊加后的圖 // } // public void changeState(int position) { // // 多選時 // if (multiChoose == true) { // mImage_bs // .setElementAt(!mImage_bs.elementAt(position), position); // 直接取反即可 // } // // 單選時 // else { // if (lastPosition != -1) // mImage_bs.setElementAt(false, lastPosition); // 取消上一次的選中狀態 // mImage_bs // .setElementAt(!mImage_bs.elementAt(position), position); // 直接取反即可 // lastPosition = position; // 記錄本次選中的位置 // } // notifyDataSetChanged(); // 通知適配器進行更新 // } @Override public int getCount() { return listbean.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return listbean.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final Handle handle; if (convertView == null) { convertView = LayoutInflater.from(context).inflate( R.layout.grivview_textview_img, null); handle = new Handle(); handle.imageView = (ImageView) convertView .findViewById(R.id.Grid_image); handle.tv = (TextView) convertView.findViewById(R.id.grid_tv); convertView.setTag(handle); } else { handle = (Handle) convertView.getTag(); } // 設置數據 // handle.imageView.setBackgroundResource(listbean.get(position) // .getIcon()); int resId = mImage_bs.get(position) ? ConfigInfos.imgs[position] : ConfigInfo.img[position]; handle.imageView.setImageResource(resId); // handle.imageView.setBackgroundDrawable(makeBmp( // listbean.get(position), mImage_bs.get(position))); handle.imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.v("圖片中的項目", "你點擊了按鈕" + listbean.get(position) + position); boolean selected=mImage_bs.get(position); mImage_bs.set(position, !selected); notifyDataSetChanged(); } }); return convertView; }
通過這么篇幅代碼,我們可以得出來這樣的結論:
Ⅰ用了兩個實體類存儲圖片的實體的信息,一個布爾數組來存儲是否選中的結果。
Ⅱ點擊了相應的某項以后,使其該布爾數組所對應的布爾變量變成相應的非值。
這樣的gridview的運行結果如下: