0

我有自定义列表视图项目点击的问题。

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

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

在 getView() 中,我写道:

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

这里 myFlag 将根据切换按钮设置为真/假。

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

4

3 回答 3

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);
    }
    ...
    ...
}
于 2012-09-03T17:51:56.540 回答
0

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

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

伪代码:

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

}
于 2012-09-03T14:40:19.040 回答
0

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

于 2012-09-03T17:31:56.010 回答