我有一个带有许多图标的ListView,可以单击它们来更改各自行项的状态。我意识到我可以为所有这些创建onClick处理程序,但我想通过一种通用的方法来识别哪个图标(View)已被点击。 (例如,确定触摸坐标x,y?
的视图知道我该怎么做吗?
我使用以下处理程序获得行点击:
lvClickListener = new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick( AdapterView<?> arg0, View arg1, int position, long arg3 )
...
在每行上我有5个ImageViews。
答案 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会发生什么,我不太确定,但它可能会导致拦截触摸的问题(或者它可能没有,我不知道),但如果你不去使用整行点击,然后你可以删除它