Cześć,
chcę sobie zrobić gierkę ala memo i mam problem z szybkim klikaniem i odwracaniem obrazków.
Gdy klikam powoli to wszystko działa, gdy zacznę bardzo szybko klikać coś się sypie.
Oto kod:
public class DataItemAdapterOld extends BaseAdapter {
private final int imageFront = R.drawable.avatarm;
private Context mContext;
private ArrayList<DataItem> mDataItemArrayList;
private DataItemActive firstItem;
private DataItemActive secondItem;
private AsyncTask<Void, Void, Void> asyncTask;
private int pairs;
public DataItemAdapterOld(Context mContext, ArrayList<DataItem> mDataItemArrayList) {
this.mContext = mContext;
this.mDataItemArrayList = mDataItemArrayList;
this.pairs = mDataItemArrayList.size() / 2;
}
public int getCount() {
return this.mDataItemArrayList.size();
}
public DataItem getItem(int position) {
return mDataItemArrayList.get(position);
}
public long getItemId(int position) {
return mDataItemArrayList.get(position).getId();
}
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
convertView = inflater.inflate(R.layout.item_grid, parent, false);
holder = new ViewHolder();
holder.imageBack = (ImageView) convertView.findViewById(R.id.imageBack);
holder.imageFront = (ImageView) convertView.findViewById(R.id.imageFront);
holder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.relativeLayout);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final DataItem dataItem = mDataItemArrayList.get(position);
Bitmap bitmapOriginal = BitmapFactory.decodeFile(dataItem.getImagePath());
bitmapOriginal.recycle();
holder.imageBack.setImageBitmap(bitmapOriginal);
Bitmap bitmapFront = BitmapFactory.decodeResource(mContext.getResources(), imageFront);
bitmapFront.recycle();
holder.imageFront.setImageBitmap(bitmapFront);
final ViewHolder finalHolder = holder;
holder.relativeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (dataItem.isCheck()) {
return;
}
if (dataItem.isActive()) {
if ((firstItem != null && secondItem == null) || (firstItem == null && secondItem != null)) {
clearItems(firstItem, secondItem);
return;
}
}
if (firstItem != null && secondItem != null) {
asyncTask.cancel(true);
firstItem = null;
secondItem = null;
}
DataItemActive dataItemActive = new DataItemActive();
dataItemActive.setPosition(position);
dataItemActive.setImageBack(finalHolder.imageBack);
dataItemActive.setImageFront(finalHolder.imageFront);
if (firstItem == null) {
firstItem = dataItemActive;
} else {
secondItem = dataItemActive;
}
applyRotation(dataItemActive);
}
});
return convertView;
}
private synchronized void applyRotation(final DataItemActive dataItemActive) {
if (dataItemActive == null) {
return;
}
final boolean isActive = mDataItemArrayList.get(dataItemActive.getPosition()).isActive();
final ImageView imageBack = dataItemActive.getImageBack();
ImageView imageFront = dataItemActive.getImageFront();
int start = 0;
int end = 90;
if (isActive) {
end = -90;
}
final float centerX = 50;
final float centerY = 50;
final Flip3dAnimation rotation = new Flip3dAnimation(start, end, centerX, centerY);
rotation.setDuration(500);
rotation.setFillAfter(true);
rotation.setInterpolator(new AccelerateInterpolator());
rotation.setAnimationListener(new DisplayNextView(isActive, imageBack, imageFront));
if (isActive) {
removeItem(dataItemActive);
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
imageBack.startAnimation(rotation);
}
}.execute();
} else {
imageFront.startAnimation(rotation);
mDataItemArrayList.get(dataItemActive.getPosition()).setActive(true);
checkIsPair();
}
}
private void removeItem(DataItemActive dataItemActive) {
mDataItemArrayList.get(dataItemActive.getPosition()).setActive(false);
if (firstItem != null && firstItem.equals(dataItemActive)) {
firstItem = null;
return;
}
if (secondItem != null && secondItem.equals(dataItemActive)) {
secondItem = null;
}
}
private void checkIsPair() {
if (firstItem == null || secondItem == null) {
return;
}
if (mDataItemArrayList.get(firstItem.getPosition()).getId() == mDataItemArrayList.get(secondItem.getPosition()).getId()) {
mDataItemArrayList.get(firstItem.getPosition()).setCheck(true);
mDataItemArrayList.get(secondItem.getPosition()).setCheck(true);
firstItem = null;
secondItem = null;
pairs--;
checkIsEndGame();
} else {
asyncTask = new AsyncTask<Void, Void, Void>() {
DataItemActive item1 = firstItem;
DataItemActive item2 = secondItem;
@Override
protected Void doInBackground(Void... voids) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
clearItems(item1, item2);
}
@Override
protected void onCancelled() {
super.onCancelled();
clearItems(item1, item2);
}
};
firstItem = null;
secondItem = null;
asyncTask.execute();
}
}
private void checkIsEndGame() {
if (pairs <= 0) {
ToastManager.ToastError(mContext, mContext.getString(R.string.game_end));
}
}
private void clearItems(DataItemActive firstItem, DataItemActive secondItem) {
if (firstItem != null) {
mDataItemArrayList.get(firstItem.getPosition()).setActive(true);
applyRotation(firstItem);
}
if (secondItem != null) {
mDataItemArrayList.get(secondItem.getPosition()).setActive(true);
applyRotation(secondItem);
}
}
static class ViewHolder {
ImageView imageFront;
ImageView imageBack;
RelativeLayout relativeLayout;
}
}
public class DataItemActive {
private int position;
private ImageView imageFront;
private ImageView imageBack;
/* settery i gettery */
}
public class DataItem {
private long id;
private String label;
private String imagePath;
private boolean active;
private boolean check;
/* settery i gettery */
}
odwracanie karty zrobiłem w asynctasku bo nie chciałem blokować interfejsu głównego tak aby można było dalej wybierać pary i chyba gdzieś się walnąłem, bo przy szybkim klikaniu anuluje asynctaska i chyba coś się wykłada.
Pomoże ktoś? 😉