Android: обновление изображения в GridView при сенсорном событии в адаптере
у меня естьGridView
и прикрепил к нему адаптер. Адаптер заполняет изображения в сетке. Я поставилsetOnTouchLister
вGridView
в моемActivity
и реализовано только в адаптере. В адаптере у меня естьInteger[] imageIDs
который содержит идентификаторы ресурсов всех добавленных изображений иArrayList<ImageSourceObject> imgObjsArr
это расширяетImageView
& имеет другие свойства.
СейчасonTouch()
Я хочу изменить изображение выбранного изображения на другое. Вот мой код: установка адаптера сетки вActivity
вonCreate
:
// 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);
АДАПТЕР:
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;
}
Журналы:
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
Журналы говорят, что объект вInteger[]
& ArrayList
оба обновлены и имеют правильные значения. После всего этого изображение также не обновляется на экране.gridViewResAdap
также является объектом сетки, которая передается из действия. Я пробовал звонитьinvalidate()
на это тоже, но пока нет результатов. Как по моемуgetView()
, Я используюimageIDs
, поэтому я сохранил это также обновленным.
ImageSourceObject:
public class ImageSourceObject extends ImageView {
public void setImage(int resourceId) {
super.setImageResource(resourceId);
this.setId(resourceId);
}
Также,onTouch()
дает ошибку для вызоваonPerformClick()
Я не знаю, куда звонить и зачем звонить. У меня алос не реализованonClickListener
в адаптере. Что можно сделать в этом случае и что написать вonClickListener
когда все происходит вonTouch()
.
Можете ли вы помочь мне узнать, почему объект изображения не обновляется и где я ошибаюсь? Я думал, что должен обновить сетку, поэтому также вызвал invalidate (), но безрезультатно.
Любая помощь высоко ценится.
Спасибо