我正在开发一款游戏,我有一个库存作为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;
}
答案 0 :(得分:3)
选中时,只需在单元格的位图上绘制一个复选框。未切换时切换原稿。
如何使用此代码:
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;
}
使用优秀的code by Mihai Fonoage。
然后:
IT工作。
看一下this example - 他们使用一个自定义布局类来实现Checkable界面,并在选中的项目上设置彩色背景。