Android:确定在ListView行中单击了哪个View

时间:2014-07-05 03:41:40

标签: android listview view click

我有一个带有许多图标的ListView,可以单击它们来更改各自行项的状态。我意识到我可以为所有这些创建onClick处理程序,但我想通过一种通用的方法来识别哪个图标(View)已被点击。 (例如,确定触摸坐标x,y?

的视图

知道我该怎么做吗?

我使用以下处理程序获得行点击:

  lvClickListener = new AdapterView.OnItemClickListener()
  {
    @Override
    public void onItemClick( AdapterView<?> arg0, View arg1, int position, long arg3 ) 
    ...

在每行上我有5个ImageViews。

2 个答案:

答案 0 :(得分:1)

您可以通过多种方式执行此操作,您可以将每个ImageView标记为您使用的AsyncTask(或其他)。或者,请参阅https://github.com/square/picasso

答案 1 :(得分:1)

我假设所有行都使用相同的布局进行充气,并且您正在使用持有者模式(http://developer.android.com/training/improving-layouts/smooth-scrolling.html)。

这样,你可以让一个OnClickListener“监听”你的任何ImageView(或者它们是什么)。您只需要在实际膨胀视图的瞬间设置侦听器(而不是在重用它时),然后为同一行中的所有ImageView设置行位置作为Tag,那么,在onClick方法中,您可以chech到他们属于哪一行(通过标签)和ImageView是什么(通过id)

class MyAdapter extends BaseAdapter implements OnClickListener

[...]

@Override
public View getView (int position, View convertView, ViewGroup parent)
{
    MyHolder holder = null;

    if(convertView != null)
    {
        holder = new MyHolder();

        convertView = inflater.inflate(...)
        holder.imageView1 = (ImageView)convertView.findViewById(R.id.[...] )
        holder.imageView1.setOnClickListener(this);
        holder.imageView2 = (ImageView)convertView.findViewById(R.id.[...] )
        holder.imageView2.setOnClickListener(this);
        [...]

        convertView.setTag(holder);
    }
    else
    {
        holder = (HyHolder)convertView.getTag();
        [...]
    }

    holder.imageView1.setTag(position);
    holder.imageView2.setTag(position);

    [...]

    return convertView;
 }


 @Override
 public void onClick(View v)
 {
     int id = v.getId();
     Integer position = (Integer)v.getTag();

     [...]
 }

当然,您可以对此进行优化,将视图放在数组或其他内容中,或者将OnClickListener放在适配器外部(在活动中,或实例变量中),但这是基本的想法。

作为一个注释,你应该检查onItemClickListener会发生什么,我不太确定,但它可能会导致拦截触摸的问题(或者它可能没有,我不知道),但如果你不去使用整行点击,然后你可以删除它