【问题标题】:block access to GridView阻止对 GridView 的访问
【发布时间】: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;
        }
    }
}

【问题讨论】:

标签: java android gridview onclick


【解决方案1】:

您可以尝试在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
    }
};

【讨论】:

  • 是的,这行得通! :) 但我认为可能有更聪明的方法:)
  • @h0ppel 我还能想到另外一种方法:但它需要在您的自定义 GridView 中覆盖此方法 stackoverflow.com/a/12977997/1032167。不要认为在你的情况下这是值得的。
猜你喜欢
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 2015-03-09
  • 2017-05-22
  • 2013-01-01
  • 2015-07-06
  • 1970-01-01
相关资源
最近更新 更多