Android: Atualizar imagem no evento GridView on touch no adaptador
eu tenho umGridView
e adaptador conectado a ele. O adaptador preenche imagens na grade. Eu arrumeisetOnTouchLister
paraGridView
no meuActivity
e implementado apenas no adaptador. No adaptador eu tenho umInteger[] imageIDs
que contém identificações de recursos de todas as imagens adicionadas e umArrayList<ImageSourceObject> imgObjsArr
que se estendeImageView
& tem outras propriedades definidas.
AgoraonTouch()
, Quero mudar a imagem da imagem selecionada para outra. Aqui está o meu código: Instalando o adaptador de grade emActivity
noonCreate
:
// Set Objects in Game View
gameView = (GridView) this.findViewById(R.id.game_gridView);
gameObjAdapter = new GameObjectsAdapter(this, R.id.game_gridView, null);
gameView.setAdapter(gameObjAdapter);
ADAPTADOR:
public class GameObjectsAdapter extends BaseAdapter implements OnTouchListener {
super();
mContext = c;
this.layoutResourceId = layoutResourceId;
objects = data;
gridViewResAdap = (GridView) mContext.findViewById(this.layoutResourceId);
createObjectsArray();
Log.d("GOA", "Created Objects Array");
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageSourceObject imgView;
if (convertView == null) {
imgView = new ImageSourceObject(mContext);
imgView.setLayoutParams(new GridView.LayoutParams(20, 20));
imgView.getScaleType();
imgView.setScaleType(ScaleType.FIT_XY);
imgView.setPadding(0, 0, 0, 0);
} else {
imgView = (ImageSourceObject) convertView;
}
// Chk status of touched of imgView & set image accordingly
if (imgView.isTouched())
imgView.setImage(R.drawable.droid_touched2);
else
imgView.setImage(imageIds[position]);
return imgView;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
int action = event.getActionMasked();
float currentXPos = event.getX();
float currentYPos = event.getY();
int position = gridViewResAdap.pointToPosition((int)currentXPos, (int) currentYPos);
// Key was Pressed Here
if (action == MotionEvent.ACTION_UP) {
if (position > 0) {
// Get the object which is clicked
ImageSourceObject isb = this.imgObjsArr.get(position);
Log.d("GA", " Postion ID " + isb.getId() + " [] ID : " + imageIds[position]);
// Change the status of touched & set image
isb.setTouched(true);
isb.setImage(R.drawable.droid_touched2);
// Update the ArrayList & Integer[] with this updated obj
this.imgObjsArr.set(position, isb);
imageIds[position] = R.drawable.droid_touched2;
Log.d("ISB", "++++ Object ID : " + isb.getId() + " [] ID : " + imageIds[position] + " ISB Touched :" + isb.isTouched());
Toast.makeText(mContext, "Postion Pressed : " + (position+1),
Toast.LENGTH_SHORT).show();
//this.gridViewResAdap.invalidate();
}
return true;
}
return false;
}
Registros:
02-19 15:19:11.615: D/GA(2046): Postion ID 2130837556 [] ID : 2130837556
02-19 15:19:11.617: D/ISB(2046): ++++ Object ID : 2130837559 [] ID : 2130837559 ISB Touched :true
Os logs dizem que o objeto emInteger[]
& ArrayList
ambos são atualizados e possuem valores corretos. Depois de tudo isso, também a imagem não é atualizada na tela. ogridViewResAdap
também é o objeto da grade que é passado da atividade. Eu tentei ligarinvalidate()
nele também, mas ainda não há resultados. Como no meugetView()
, Estou usandoimageIDs
, então eu também mantive isso atualizado.
ImageSourceObject:
public class ImageSourceObject extends ImageView {
public void setImage(int resourceId) {
super.setImageResource(resourceId);
this.setId(resourceId);
}
Além disso,onTouch()
dá erro ao ligaronPerformClick()
, Não sei para onde ligar e por que ligar. Eu não tenho implementadoonClickListener
no adaptador. O que pode ser feito neste caso e o que escreveronClickListener
quando as coisas são manejadasonTouch()
.
Você pode me ajudar a saber por que o objeto de imagem não está sendo atualizado e onde estou errado? Eu pensei que tinha que atualizar a grade, então também chamado invalidate (), mas sem resultados.
Qualquer ajuda é muito apreciada.
obrigado