ListView自定义行布局中的项目onClick()事件相关帮助

5
我有一个ListView,其中的行由我格式化。每一行都有ImageView和TextView的混合。 我还实现了自己的适配器,并能够通过它绘制每一行。
现在,我想要这样的东西-
  • 用户点击ImageView(不是行的任何其他位置,而只有此ImageView应对点击做出响应)
  • 我得知了被点击的ImageView所在行的位置。
我尝试了很多方法来实现这个功能,并希望我的代码尽可能高效(以过度设计为代价)。 目前,我只能捕获特定ImageView上的单击事件,但我无法知道点击了哪一行。
我在Row XML中提供了一个属性,如下-
<ImageView android:id="@+id/user_image"
    android:padding="5dip" 
    android:layout_height="60dip" 
    android:layout_width="60dip"
    android:clickable="true"
    android:onClick="uImgClickHandler"/> 

在我的代码中,我有一个像这样的方法:

public void uImgClickHandler(View v){
  Log.d("IMG CLICKED", ""+v.getId());
  LinearLayout parentRow = (LinearLayout)v.getParent();

 }

我可以获取父行(也许),但不确定如何从这里继续。请有人帮忙吗?


你想要实现什么目标?你想在其他行的小部件上设置一些属性吗? - Vincent Mimoun-Prat
我希望用户只能点击ImageView,任何行内的其他地方都不能点击。基于被点击的ImageView,我想要知道该行的位置,然后在数据源中查找该位置的信息,并启动另一个活动。顺便说一下,这个问题已经得到了下面回答的完美解决。 - Aman Alam
4个回答

14

请参考以下内容,
我只是写了一些代码来给你一个想法,并不是正式的格式。

 class youaddaper extends BaseAdapter{

   public View getView(int position, View convertView, ViewGroup parent){
        LayoutInflater inflate = LayoutInflater.from(context);
        View v = inflate.inflate(id, parent, false);

      ImageView imageview = (ImageView) v.findViewById(R.id.imageView);
        imageview.setOnClickListener(new imageViewClickListener(position));
      //you can pass what ever to this class you want,
      //i mean, you can use array(postion) as per the logic you need to implement 
   }
   class imageViewClickListener implements OnClickListener {
   int position;
    public imageViewClickListener( int pos)
        {
            this.position = pos;
        }

    public void onClick(View v) {
      {// you can write the code what happens for the that click and 
       // you will get the selected row index in position
     }
}

}

希望这对你有所帮助


好的。它确实有帮助。我打算试一下。 - Aman Alam
它起作用了。但是可能会增加一些开销,因为它为每个ImageView分别创建了对象。稍后将对其进行优化。谢谢! :) - Aman Alam
这对我也起作用了。我对你关于创建单独对象的评论很感兴趣,你认为有什么更好的方法可以做到呢?我看到的几个例子总是在内部创建监听器对象。 - Eugene van der Merwe

1

另一种选择是使用视图的 setTag()getTag() 方法。您可以在您的 getView 中像这样设置它:

imageView.setTag(new Integer(position));

然后在 onClick() 中,您可以通过以下方式找到标记:
Integer tag = v.getTag();

接下来将使用此方法将图像视图与列表视图项的位置相关联。

请注意,如果列表视图可以从中间失去项目,从而在列表视图的生命周期中更改项目位置,则此方法将存在问题。


0

你可以像这样简单地操作: 在我们的适配器的getview方法中 Button btn1 = (Button) convertView.findViewById(R.id.btn1); btn1.setOnClickListener(mActivity);

此外,你可以在你的活动中处理onclick事件, 对于活动的上下文,在适配器的构造函数中只需传递this并在此处将其转换为活动,如下所示: MyActivity mActivity=(MyActivity)context; 谢谢


这是一个有效的选择,但当此按钮被点击并且控制权转移到驻留在活动中的我的中央方法时,它将无法了解该按钮所在的行,这使得问题更加复杂。 - Aman Alam

0

这似乎适用于一个包含有 android:onClick="editImage" 的 ImageView 的 ListActivity 中:

public void editImage(View v) {
        int[] loc = new int[2];
        v.getLocationInWindow(loc);
        int pos = getListView().pointToPosition(loc[0], loc[1]);
        Cursor c = (Cursor) adapter.getItem(pos);
        // c now points at the data row corresponding to the clicked row
}

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