Я написал простую игру памяти. Вы нажимаете на одну из 16 карт (кнопки изображения), она перевернута, чтобы показать плод (например, изображение банана), и вы щелкаете другой карточкой, чтобы она перевернулась и раскрыть ее плод. Затем, если изображения совпадают, через секунду или два эти два фрагмента заменяются пробелом (т.е. удаляются с доски). Это происходит до тех пор, пока все не будет удалено. Также имя плода зачитывается в устной форме. Все упомянутое работает отлично, первая карта перевернута и изображение показано, за исключением случаев, когда вторая карта нажата, она никогда не отображает фрукты. Правильное название фрукта произносится, и я использовал аналогичный код для второй карточки, щелкнувшей по первой клике. Можете ли вы найти, где я ошибся?
Ключевым разделом в моем коде ниже является то, что показано ниже: "//так, что выбрано два изображения, они соответствуют?"
Первое изображение обновляется после нажатия на него. Однако, щелкнул ли первый фрукт = второй щелчок, или нет, пустая плитка не "повернулась", чтобы показать изображение.
Код:.... продолжается
gridview.setOnItemClickListener(new OnItemClickListener()
{
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
int fruitselected = (int)FruitToChooseFromImages.get(position);
// start
if (position == firstfruitselpos && imagesSelectedThusFar == 1 || fruitselected == R.drawable.blank)
{
// (if blank icon clicked) then DO NOTHING
}
else
{ // a valid fruit has been selected, so firstly, say the fruit name
int soundtoplaynow = getrightsound(position, fruitselected);
SoundManager.playSound(soundtoplaynow, 1);
// next
if (imagesSelectedThusFar == 0)
{
imagesSelectedThusFar = 1;
firstfruitselected = fruitselected; firstfruitselpos = position;
FruitToDisplayImages.set(position, fruitselected);
MyGridviewAdapter1.notifyDataChanged();
gridview.invalidateViews();
}
else // so two images have been selected! do they match?
{
imagesSelectedThusFar = 0; // has reached 2, so reset to zero
secondfruitselected = fruitselected; secondfruitselpos = position;
FruitToDisplayImages.set(position, fruitselected);
MyGridviewAdapter1.notifyDataChanged();
gridview.invalidateViews();
try{ Thread.sleep(1500); }catch(InterruptedException e){ }
if (firstfruitselected == secondfruitselected) //yes they match
{
SoundManager.playSound(50, 1);// play happy sound
//switch fruit image to blank and display blank at position clicked **
FruitToDisplayImages.set(position, R.drawable.blank);
FruitToChooseFromImages.set(position, R.drawable.blank);
FruitToDisplayImages.set(firstfruitselpos, R.drawable.blank);
FruitToChooseFromImages.set(firstfruitselpos, R.drawable.blank);
MyGridviewAdapter1.notifyDataChanged();
gridview.invalidateViews();
fruitleft = (fruitleft - 2);
}
else // nope, dont match
{ // you selected the wrong fruit, sorry.
SoundManager.playSound(60, 1); // play UNhappy sound
try{ Thread.sleep(1500); }catch(InterruptedException e){ }
FruitToChooseFromImages.set(firstfruitselpos, firstfruitselected);
FruitToDisplayImages.set(firstfruitselpos, R.drawable.blanktile);
FruitToDisplayImages.set(secondfruitselpos, R.drawable.blanktile);
MyGridviewAdapter1.notifyDataChanged();
gridview.invalidateViews();
}
}
}
// end
if (fruitleft == 0)
{ //end game - add code here
SoundManager.playSound(70, 1); // play big happy congrats sound
} }
});
и т.д
Записи журнала говорят мне, что все работает точно так, как было задумано за кулисами, оно просто не обновляло gridview, как я просил об этом! Я изменил этот код без конца, используя общие методы устранения неполадок, но ничего не работало. Это просто то же самое.
После того, как изображения, которые будут отображаться, не будут сброшены вообще, но будут обновляться в другом месте, позже в цепочке событий прослушивания onclick я обнаружил, что gridview будет обновляться/отображаться корректно позже, когда я призываю его обновить. После попытки отложить обновление gridview с помощью sleep, чтобы иметь такой же эффект, полагая, что это решение и не удалось решить проблему, я создал обработчик, который задерживал сброс плитки до пустого или прозрачного, что позволяло отображать изображение. Задача решена.