-1

I have a little memory game where you can click on 2 images in a row. The images are displayed in a GridView. After 2 clicks I compare these flipped images. If they are not the same, this code will be executed:

                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);
       }
    };

So the User can see the clicked images for 2 seconds and then they will switch back to the card back. But how can I block user actions on the GridView/ImageView in those two seconds. Otherwise, any number of images can be uncovered in those two seconds without comparison.

I tried stuff like:

gridview.setClickable(false);

or

gridview.setEnabled(false);

but I always got an error. I would be grateful for help.

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;
        }
    }
}
h0ppel
  • 347
  • 2
  • 5
  • 21

1 Answers1

0

You can try to use some boolean in switchImage or anywhere higher in the stack. Something like this:

private boolean interactionEnabled = true; // code added
public void switchImage(int position, View view){
    if (!interactionEnabled) return; // code added
     //... your code here

    else{
        interactionEnabled = false; // code added
        Handler mHandler = new Handler(); 
        mHandler.postDelayed(update, 2000);
    }                  
}

private Runnable update = new Runnable() {
    public void run() {
         viewHolder[0].setImageResource(R.drawable.card_back);
         viewHolder[1].setImageResource(R.drawable.card_back);
         interactionEnabled = true; // code added
    }
};
varren
  • 14,551
  • 2
  • 41
  • 72
  • Yes , that works! :) but I thought that there might be a smarter way :) – h0ppel Jun 20 '15 at 16:36
  • @h0ppel i can think of 1 more way: But it requires overriding this method http://stackoverflow.com/a/12977997/1032167 in your custom GridView. Don't think it is worth it in your case. – varren Jun 20 '15 at 16:44