如何处理自定义列表视图项目点击?

时间:2012-09-03 14:24:55

标签: android listview

我在点击自定义列表视图项时遇到问题。

在我的活动中,我有一个按钮和一个自定义ListView,以便在单击按钮时,每个项目左侧都会显示复选框,再次单击按钮时,复选框将消失。默认情况下,单击该项目时,它应显示Toast1 ,并且在单击按钮时(启用复选框时),它应显示Toast2。因此按钮的作用类似于切换按钮。

所以我在Activity中编写了ListView.onitemclickListener来在getView中显示Toast1和convertView.setOnClickListener来显示Toast2。

在getView()中,我写了:

if(myFlag)
{
  convertView.setOnClickListener ... 
  {
      display Toast2
  }
}

此处myFlag将根据切换按钮设置为true / false。

但是当点击切换按钮并单击列表视图项后,有时它会显示Toast1,有时会显示Toast2。

3 个答案:

答案 0 :(得分:0)

在运行时添加不同的OnClickListener可能会导致一些问题,特别是如果将它绑定到getView()方法。

如果您使用单个onClickListener并在那里检查您的标记,它应该按照您想要的方式工作。

伪代码:

    convertView.setOnClickListener ... 
  {
       if(myFlag){
       hide checkbox;
       display Toast2;
       myFlag =false;
     }
      else {
       show checkbox;
       display Toast 1;
       myFlag =true;
     }

}

答案 1 :(得分:0)

最后我自己解决了这个问题。 只需在getView()方法中将convertView的setclickable()设置为true / false即可。如果设置为true,则Toast2将显示(),如果设置为False,则将显示Toast1。

答案 2 :(得分:0)

我使用setTag()/ getTag()方法获取项目的位置。在列表适配器的getView()方法中,使用 setTag(“position”)方法将项目的位置设置为行项目的标记(在您的案例按钮中)。
单击任何行中的按钮时,将为该按钮调用onClick()方法,在onClick()方法中,可以使用 getTag()方法获取位置。对所有行按钮使用与onClick例程相同的方法。

示例代码:列表项可能是这样的

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<Button
    android:id="@+id/button1"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="117dp"
    android:background="@drawable/grad"
    android:onClick="onButtonClick" />

getView()方法可能是这样的:

public View getView (int position, View convertView, ViewGroup parent) {
    ...
    ...
    button.setTag(position);
    ...
}

onClick例程可能是这样的:

public void onButtonClick(View v) {
    String tag = v.getTag().toString();
    if(tag != null) {
         int position = Integer.parseInt(tag);
    }
    ...
    ...
}