Android 如何处理自定义listview项目单击?

Android 如何处理自定义listview项目单击?,android,listview,Android,Listview,我对自定义listview项单击有问题 在我的“活动”中,我有一个按钮和一个自定义列表视图,单击按钮时,复选框会显示在每个项目的左侧,再次单击按钮时,复选框会消失。默认情况下,单击项目时,它会显示为AST1,单击按钮时(启用复选框时),它应该显示Toast2。因此该按钮的作用类似于切换按钮 因此,我在Activity中编写了ListView.onitemclickListener,以显示Toast1,并在getView中编写了convertView.setOnClickListener,以显示T

我对自定义listview项单击有问题

在我的“活动”中,我有一个按钮和一个自定义列表视图,单击按钮时,复选框会显示在每个项目的左侧,再次单击按钮时,复选框会消失。默认情况下,单击项目时,它会显示为AST1,单击按钮时(启用复选框时),它应该显示Toast2。因此该按钮的作用类似于切换按钮

因此,我在Activity中编写了
ListView.onitemclickListener
,以显示Toast1,并在getView中编写了
convertView.setOnClickListener
,以显示Toast2

在getView()中,我写了:

if(myFlag)
{
  convertView.setOnClickListener ... 
  {
      display Toast2
  }
}
此处,myFlag将根据切换按钮设置为真/假


但是,在单击“切换”按钮并单击listview项之后,有时它会显示为Toast1,有时会显示为Toast2。

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

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

伪代码:

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

}

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

我使用setTag()/getTag()方法获取项目的位置。在列表适配器的getView()方法中,使用setTag(“位置”)方法将项目的位置设置为行项目的标记(在您的案例中为按钮)。
单击任意行中的按钮时,将为该按钮调用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" />
onClick例程可以是这样的:

public View getView (int position, View convertView, ViewGroup parent) {
    ...
    ...
    button.setTag(position);
    ...
}
public void onButtonClick(View v) {
    String tag = v.getTag().toString();
    if(tag != null) {
         int position = Integer.parseInt(tag);
    }
    ...
    ...
}

事实上,我应该放首歌,而不是烤面包。因此,它应该写在我的项目中的活动中。在clicklistner中启动歌曲到底有什么问题?您可以使用view.getContext()从侦听器内部访问您的活动。我在listview.itemclick-variables中有很多复杂的代码,广播等。我只是想知道我如何处理这两个地方的点击。实际上我的问题与你的答案略有不同。我没有每行按钮,这里与位置无关。顺便说一句,我可以直接在listview.itemclick上获得该职位。无论如何,我学会了一个新的主题setTag和getTag。感谢您的帮助。列表视图项单击和视图单击是否同时为您工作???是的,它们正在工作。如果convertview的setclickable()设置为false-listview项单击正常。如果设置为true,则getView()中的“查看”按钮可以工作。我同时询问了……这两个按钮不能同时工作(直到并除非您将一个按钮的单击传递给另一个按钮)。其中一个必须被禁用,因为您正在使用convertview的setClickable()。我现在明白您的意思了。无论如何,我一次只想让一个人工作。