在ListView的ListItem中点击ImageView并获取位置?

6

目前,当点击ListItem时,我会获取它的位置并将其传递给StopsScheduleActiviy。我希望能够检测到单击该ListItem的ImageView,以便我可以启动MapActivity并将位置传递给它。

基本上:单击ImageView启动MapsActivity,否则在ListItem上的任何其他位置单击启动StopsScheduleActivity。在两种情况下,我都需要位置信息。我该如何做?

以下是我的当前onItemClick监听器。

@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.");
}

这是我的ListView,其中有一个ImageView作为地图。我希望能监听它的点击事件。谢谢!

onItemClick的位置不会给出位置吗? - Lalit Poptani
2
在这个自定义适配器中,在GetView()方法中编写ImageView的onClick()。然后做你想做的事情... - user370305
@LalitPoptani 它确实可以,但我怎么知道 ImageView 被点击了呢? - Ryan R
看看这个教程Android系列:自定义ListView项和适配器,在适配器的getView方法中,你可以编写imageView.setOnClick()和你的内容... - user370305
试一下,然后告诉我发生了什么.. :-) - user370305
显示剩余3条评论
4个回答

26
在您的自定义适配器的getView()方法中,当您初始化ImageView时,请将位置作为图像视图的标记添加。因此,每次出现新的ImageView时,它都将在其标记中保存其位置。然后只需在getView()中添加OnClickListener()OnClickListener(View view)包含被用户点击的视图。因此,当用户单击列表中的任何图像视图时,它将作为单击视图传递给OnClickListener(View view)。我们知道,我们的ImageView包含位置作为标记。因此,该标记可以告诉我们这个ImageView是用于哪个位置的。 :)
@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;
}

您将获得所点击的ImageView位置。


12

对于 ImageView 的点击事件,您需要为您的 ListView 制作自定义适配器。

在适配器的 getView() 方法中,只需编写 imageView's onClick(),并从该 imageView 的 onClick() 启动新的活动。

要创建自定义列表,请参考本教程:Android 系列:自定义 ListView 项和适配器


再次感谢。对于那些感兴趣的人,请查看主要问题评论以获取更多信息。此外,Arslan的答案显示了与我最终使用的代码实现非常相似。 - Ryan R
如何从新的活动中返回结果?如何在此处使用onActivityResult()? - Jas
@Jas - 使用setResult()方法在其中设置Intent。并在onActivityResult()中获取此Intent。请参阅https://dev59.com/XnNA5IYBdhLWcg3wh-gC - user370305
我只能在Activity中编写onActivityResult(),对吗?如果我从适配器类中触发意图,那么我应该在哪里编写onActivityResult() - Jas
在调用您的“适配器”的Activity中,您正在使用上下文来调用startActivityForResult() - user370305

4
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    System.out.println("getView " + position + " " + convertView);
    ViewHolder holder = null;

    if (convertView == null) {
        convertView = LayoutInflater.from(conText).inflate(
            R.layout.gridgoggle, parent, false);
        holder = new ViewHolder();
        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.imageView1.setImageResource(Integer.parseInt((mData
        .get(position).get("image"))));

    holder.imageView1.setId(position);
    holder.imageView1.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            int id = v.getId();
            //here id is position.
            Intent myIntent = new Intent(this, StopsScheduleActivity.class);
            myIntent.putExtra("stop", id);
            startActivity(myIntent);
        }
    });
    return convertView;
}

0
在三个简单的步骤中:
1. 在您的适配器方法getView(int position, View convertView, ViewGroup parent)中:
ImageView imageview =(ImageView) convertView.findViewById(R.id.imageView);
imageview.setTag(new Integer(position));

2 在 layout.xml 中为 ImageView 添加 onClick() 方法

3 实现 onClick() 方法并通过 view.getTag() 检索索引


请了解行内格式化的用法,例如 像这样。我将编辑您的问题。 - Ali Bdeir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接