Click ImageView within a ListView ListItem and get the position?

Ryan R picture Ryan R · Dec 20, 2011 · Viewed 26.9k times · Source

Currently, when the ListItem is clicked I grab its position and pass it to my StopsScheduleActiviy. I would like to detect when the ImageView of that ListItem is clicked so that I can launch my MapActivity instead and pass it the position.

Basically: Click the ImageView launch MapsActivity, otherwise click anywhere else on ListItem launch StopsScheduleActivity. In Both cases I need the position. How can I do this?

Here is my current onItemClick listener.

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    Intent myIntent = new Intent(this, StopsScheduleActivity.class);
    myIntent.putExtra("stop", stops.get(position));

    startActivity(myIntent);

    Log.i("Winnipeg Bus", "Stop item #" + id + " clicked.");
}

Here is my ListView with a map for an ImageView that I want to listen to for clicks. Thanks!

enter image description here

Answer

Arslan Anwar picture Arslan Anwar · Dec 20, 2011

In you Custom Adapter getView() method , when you are init the ImageView. Add position as a tag for image view. So each time when new ImageView will appear it will hold its position in his tag. Then just add the OnClickListener() in getView().

OnClickListener(View view) contains the view which was clicked by user. So when user will click any image view in the list. Then it will be passed to OnClickListener(View view) as a clicked view. And we know that our ImageView contains the position as a tag. So the tag can tell us that this ImageView is for ? position. :)

@Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if(convertView == null){
            convertView = inflater.inflate(R.layout.list_row, parent, false);
        }

        ImageView imageView = (ImageView) convertView.findViewById(R.id.videoListImage);
        imageView.setTag(new Integer(position));
        imageView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                Toast.makeText(mContext, "ImageView clicked for the row = "+view.getTag().toString(), Toast.LENGTH_SHORT).show();
            }
        });

        return convertView;
    }

You will get the clicked ImageView position.