android - 在自定义GridView中选中带有复选框的多个对象

时间:2013-03-21 16:05:29

标签: android gridview checkbox multi-select

我正在开发一款游戏,我有一个库存作为GridView。每个网格项都是一个GameObject,在单击时选中它。游戏表明用户可以选择单个对象或组合对象。

我需要的是非常具体的:我想当用户按下菜单按钮并出现optionsMenu(带有“合并”选项)时,动态地在每个网格项上绘制一个复选框,以便多选一些项目(非常像在Gallery中,但是使用对象而不是图像)然后将它们组合起来。

我正在使用API​​级别8,因此MultiChoiceMode让我很难过。

此外,如果有人对如何实现此功能而不是使用复选框有更好的建议,我肯定会对此持开放态度。 Thanx提前

这是网格项的xml:

<ImageView
    android:id="@+id/grid_item_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

<CheckBox
    android:id="@+id/image_check"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:visibility="invisible" />

和gridView:

<TextView
    android:id="@+id/inventoryMsg"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:background="#000000"
    android:gravity="center"
    android:text="@string/inventory"/>

<GridView
    android:id="@+id/gridView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_above="@id/inventoryMsg"
    android:columnWidth="90dp"
    android:gravity="center"
    android:horizontalSpacing="10dp"
    android:numColumns="3"
    android:stretchMode="columnWidth"
    android:verticalSpacing="10dp" />

这是我的CustomAdapter中的getViewMethod:

public View getView (int position, View convertView, ViewGroup parent) {


            View v = convertView;

    if (convertView == null) {
        holder = new ViewHolder();
        LayoutInflater layoutInflater = (LayoutInflater) a.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = layoutInflater.inflate(R.layout.griditem, null);
        holder.gameItemCheck = (CheckBox) v.findViewById(R.id.image_check);
        v.setTag(holder);
    } else {
        holder = (ViewHolder) v.getTag();
    }
    holder.gameItemCheck.setId(position);
    holder.gameItemCheck.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            //dosomestuff
        }
    });

    GameObject gameObject = gameObjectList.get(position);
    ImageView gameItemImageView = (ImageView) v.findViewById(R.id.grid_item_image);


    holder.gameItemCheck.setChecked(Inventory.selected[position]);
    holder.id = position;
    return v;
}

public class ViewHolder {

    public CheckBox gameItemCheck;
    int id;
}

我尝试更改动态的visibilty动态的方式:

1)

public boolean onKeyDown(int keycode, KeyEvent e) {
    switch (keycode) {
    case KeyEvent.KEYCODE_MENU:
        openOptionsMenu();
        gameObjectAdapter.holder.gameItemCheck.setVisibility(View.VISIBLE);
        gridView.refreshDrawableState();
        return true;
    }

    return super.onKeyDown(keycode, e);
}

2)

public boolean onPrepareOptionsMenu(Menu menu) {
            gameObjectAdapter.holder.gameItemCheck.setVisibility(View.VISIBLE);
            gameObjectAdapter.notifyDataSetChange();
    return true;

}

1 个答案:

答案 0 :(得分:3)

3个选项

适应图库选择

方法1:

选中时,只需在单元格的位图上绘制一个复选框。未切换时切换原稿。
如何使用此代码:

  private Bitmap drawCheck(Bitmap bmp)
  {
   Bitmap bmChecked = Bitmap.createBitmap(bmp.getWidth(),     bmp.getHeight(), bmp.getConfig());
   Bitmap check = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.upcheck);
   Canvas canvas = new Canvas(bmChecked);

   canvas.drawBitmap(bmp, 0, 0, null);
   canvas.drawBitmap(check, 0, 0, null); 
   return bmChecked;
  }

方法2

使用优秀的code by Mihai Fonoage

然后:

  1. 将一个选定的标志添加到LoadedImage类
  2. 在onItemClick()函数中,我将点击的项目标记为已选中
  3. 适配器的getView()中的
  4. 使用标志来设置图像背景
  5. IT工作。

    方法3:可检查的界面

    看一下this example - 他们使用一个自定义布局类来实现Checkable界面,并在选中的项目上设置彩色背景。