各画像に「タッチ」の側面を追加しようとしていることを除いて、このチュートリアルに従っています。
ご覧のHelloGridView
とおり、チュートリアルとまったく同じです。
public class HelloGridView extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Toast.makeText(HelloGridView.this, "" + position, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
についてImageAdapter
は、次を追加しましたonTouchListener
。
public class ImageAdapter extends BaseAdapter {
private Context mContext;
// create a new ImageView for each item referenced by the Adapter
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(300, 300));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
imageView.setImageResource(mThumbIds[position]);
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
Log.v("log_tag", "MotionEvent.ACTION_DOWN");
return true;
} else if(event.getAction()==MotionEvent.ACTION_UP){
Toast.makeText(mContext, "ACTION_UP", Toast.LENGTH_SHORT).show();
Log.v("log_tag", "MotionEvent.ACTION_UP");
return false;
} else {
return false;
}
}
});
return imageView;
}
}
問題は、画像の 1 つに触れるたびに、 で発火しますが、 ではonTouchListener
発火しませImageAdapter
ん。onItemClickListener
HelloGridView
onItemClickListener
で起動したいACTION_UP
ので、イベントが の場合は false を返し、 の場合はMotionEvent.ACTION_UP
trueを返しますMotionEvent.ACTION_DOWN
。
私の理解では、true を返すonTouchListener
と、イベントが消費されて終了します。しかし、false を返すと、onTouchListener
はイベントを消費せず、 in に渡されonItemClickListener
ますHelloGridView
。
HelloGridView
残念ながら、イベントが のときに false を返す場合にのみ、イベントが渡されACTION_DOWN
ます。しかし、私がそれを行うと、ACTION_UP
実行されることはありません。誰かが私が間違っていることと、それを修正する方法を教えてもらえますか? 私の質問が明確でない場合は、お知らせください。明確にするよう努めます。:)