【发布时间】:2015-06-20 16:08:39
【问题描述】:
我有一个小记忆游戏,您可以在其中连续单击 2 个图像。图像显示在 GridView 中。单击 2 次后,我比较了这些翻转的图像。如果它们不一样,就会执行这段代码:
else{
// new try
Handler mHandler = new Handler();
mHandler.postDelayed(update, 2000);
}
clickCounter = -1;
}
}
private Runnable update = new Runnable() {
public void run() {
viewHolder[0].setImageResource(R.drawable.card_back);
viewHolder[1].setImageResource(R.drawable.card_back);
}
};
所以用户可以看到点击的图像 2 秒钟,然后他们将切换回卡片。但是如何在这两秒钟内阻止用户对 GridView/ImageView 的操作。否则,任何数量的图像都可以在这两秒钟内发现而无需比较。
我试过这样的东西:
gridview.setClickable(false);
或
gridview.setEnabled(false);
但我总是出错。我将不胜感激。
ImageAdaper.java
final class ImageAdapter extends BaseAdapter {
private final List<Item> mItems = new ArrayList<Item>();
private final LayoutInflater mInflater;
private int clickCounter = -1;
private int countPairs = 1;
private Context mContext;
private ImageView[] viewHolder;
private Integer[] pieces;
public ImageAdapter(Context context) {
mContext = context;
viewHolder = new ImageView[2];
List ipieces = new ArrayList();
for(int i=0; i<6; i++) {
ipieces.add(i);
ipieces.add(i);
}
Collections.shuffle(ipieces);
pieces = (Integer[]) ipieces.toArray(new Integer[0]);
mInflater = LayoutInflater.from(context);
mItems.add(new Item(R.drawable.pic_1));
mItems.add(new Item(R.drawable.pic_2));
mItems.add(new Item(R.drawable.pic_3));
mItems.add(new Item(R.drawable.pic_4));
mItems.add(new Item(R.drawable.pic_5));
mItems.add(new Item(R.drawable.pic_6));
Collections.shuffle(mItems);
}
@Override
public int getCount() {
return pieces.length;
}
@Override
public Item getItem(int i) {
return mItems.get(i);
}
@Override
public long getItemId(int i) {
return mItems.get(i).drawableId;
}
@Override
public View getView(final int i, final View view, ViewGroup viewGroup) {
View v = view;
ImageView picture;
if (v == null) {
v = mInflater.inflate(R.layout.grid_item, viewGroup, false);
v.setTag(R.id.picture, v.findViewById(R.id.picture));
}
picture = (ImageView) v.getTag(R.id.picture);
picture.setImageResource(R.drawable.card_back);
picture.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
switchImage(i,v);
}
});
return v;
}
public void switchImage(int position, View view){
ImageView Image = (ImageView) view;
if(clickCounter == -1){
// first click on an image
// convert images to avoid OOME
convertImage(Image,position);
clickCounter = position;
viewHolder[0] = Image;
Log.d("ImageAdapter", "FIRST CLICK!!!!" + Integer.toString(position));
}
else{
//second click
viewHolder[1] = Image;
Log.d("ImageAdapter", "SECOND CLICK!!!!! " + Integer.toString(position));
// convert images to avoid OOME
convertImage(Image,position);
//both pictures are matching
if(pieces[clickCounter]==pieces[position]){
Log.d("ImageAdapter", "MATCH!!!!!!!!!! ");
if(countPairs<6)Toast.makeText(mContext, "Du hast ein Paar gefunden!",Toast.LENGTH_SHORT).show();
deleteClicker();
countPairs++;
}
else{
// new try
Handler mHandler = new Handler();
mHandler.postDelayed(update, 2000);
}
clickCounter = -1;
}
}
private Runnable update = new Runnable() {
public void run() {
viewHolder[0].setImageResource(R.drawable.card_back);
viewHolder[1].setImageResource(R.drawable.card_back);
}
};
public void deleteClicker(){
viewHolder[0].setEnabled(false);
viewHolder[0].setOnClickListener(null);
viewHolder[1].setOnClickListener(null);
if(countPairs == 6){
Toast.makeText(mContext, "Juhu! Du hast gewonnen",Toast.LENGTH_SHORT).show();
}
}
public void convertImage(ImageView Image, int position){
Item item = getItem(pieces[position]);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inDither = false;
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inSampleSize = 3;
Bitmap icon = BitmapFactory.decodeResource(mContext.getResources(),item.drawableId,options);
Image.setImageBitmap(icon);
}
private static class Item {
public final int drawableId;
Item(int drawableId) {
this.drawableId = drawableId;
}
}
}
【问题讨论】:
-
使用setClickable时请报错
-
试试不确定但可能对你有用stackoverflow.com/questions/26354950/…
标签: java android gridview onclick