0

画面に 5x5 の画像があり、ユーザーが画像を一致させる必要がある記憶ゲームを作成しようとしています。私は GridView を使用しており、ImageAdapter を使用して画像を入力しています。ゲームは次のように動作します: - ユーザーが 2 つの画像を一致させると、画像は画面に残ります - ユーザーが 2 つの画像を一致させることに失敗すると、画像はクエスチョン マークに戻ります。問題は、画面上で以前に一致した写真を維持できないことです.notifyDataSetChanged()メソッドを使用すると、すべての画面が再び疑問符でいっぱいになります。これが私のコードです:

// ImageAdapter の getView メソッド

public View getView(int position, View convertView, ViewGroup arg2) {
     ImageView imageView;
        if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(100, 100));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(4, 4, 4, 4);
        } else {
            imageView = (ImageView) convertView;
        }

        for(int i=0;i<16;i++)
        {
            if(mThumbIds[i].equals(R.drawable.ic_launcher))
            {
                imageView.setImageResource(R.drawable.ic_launcher);
            }
            else
                imageView.setImageResource(R.drawable.q_mark);
        }
        return imageView;
}

// ユーザーが 1 つの画像を選択したときの onClickListener

 gridview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position,
                long id) {
            i++;
            Toast.makeText(easyGame.this, "" + position, Toast.LENGTH_SHORT).show();
            ImageView imgV=(ImageView)v;

            if(i%2!=0)
            {

                firstClick=position;
                imgV.setImageResource(ImageAdapter.mThumbIds[firstClick]);

            }
            else
            {   
                secondClick=position;
                imgV.setImageResource(ImageAdapter.mThumbIds[secondClick]);
            }

            if(i%2==0)
            {

            if(!(ImageAdapter.mThumbIds[firstClick].equals(ImageAdapter.mThumbIds[secondClick])))
            {
                Toast.makeText(easyGame.this, "Great!", Toast.LENGTH_SHORT).show();
                ImageAdapter.mThumbIds[firstClick]=ImageAdapter.mThumbsIdsDone[0];
                ImageAdapter.mThumbIds[secondClick]=ImageAdapter.mThumbsIdsDone[0];
                im.notifyDataSetChanged();
                gridview.setAdapter(im);
                gridview.invalidate();
            }
            }       
        }
    });

誰でも助けることができますか?ありがとう!

4

1 に答える 1

2
// declare as class variable to keep track of views which should stay visible
private HashSet<Integer> keepVisibleViews = new HashSet<Integer>(25);

//in you on click listener
if(!(ImageAdapter.mThumbIds[firstClick].equals(ImageAdapter.mThumbIds[secondClick])))
 {
     // ... the rest of your code here
     // keep track of views that should stay visible
     keepVisibleViews.add(firstClick);
     keepVisibleViews.add(secondClick);
 }


// in your getView
// show ? mark if we should, else the picture
if (keepVisibleViews.contains(position)
      setImageResource(ImageAdapter.mThumbIds[secondClick]);
else
      imageView.setImageResource(R.drawable.q_mark);
于 2012-05-23T22:28:04.473 に答える