2015-06-20 52 views
-1

我有一個小記憶遊戲,你可以點擊連續2張圖片。圖像顯示在GridView中。點擊2次後,我會比較這些翻轉的圖像。如果它們不一樣,該代碼就會被執行:塊訪問GridView

   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; 
     } 
    } 
} 
+1

請張貼當您使用setClickable – Lokesh

+0

試不知道,但可以b爲你工作http://stackoverflow.com/questions/26354950/how-to-trigger-proper-longclick-event錯誤-on-listview – Lokesh

回答

0

您可以嘗試在堆棧中使用switchImage一些布爾或任何更高。事情是這樣的:

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 
    } 
}; 
+0

是的,這有效! :)但我認爲有可能是一個更聰明的方法:) – h0ppel

+0

@ h0ppel我可以想到更多的方法1:但它需要重寫這個方法http://stackoverflow.com/a/12977997/1032167在你的自定義GridView。不要以爲這是值得的。 – varren