【问题标题】:How to handle Custom listview item clicks?如何处理自定义列表视图项目点击?
【发布时间】:2012-09-04 01:51:56
【问题描述】:

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

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

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

在getView()中,我写了:

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

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

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

【问题讨论】:

    标签: android listview


    【解决方案1】:

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

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

    伪代码:

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

    【讨论】:

    • 其实我应该播放一首歌而不是 Toast1。因此应该写在我项目的Activity中。
    • 在 clicklistner 中启动歌曲到底有什么问题?您可以使用 view.getContext() 从侦听器内部访问您的活动
    • 我在 listview.itemclick 中有很多复杂的代码 - 变量、广播等。我只想知道如何处理它们中的点击。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我使用 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);
          }
          ...
          ...
      }
      

      【讨论】:

      • 其实我的问题和你的回答略有不同。我在每一行都没有按钮,与这里的位置无关。顺便说一句,我可以直接在 listview.itemclick 上获得职位。无论如何,我学习了一个新主题 setTag 和 getTag。谢谢你
      • 列表视图项点击和视图点击是否同时为您工作???
      • 是的,他们正在工作。如果 convertview 的 setclickable() 设置为 false - listview 项目单击正在工作。如果它设置为 true - 在 getView() 中的查看点击正在工作。
      • 我同时问....他们两个不能同时工作(除非你把一个点击传递给另一个)。必须像使用 convertview 的 setClickable() 一样禁用其中一个...
      • 我现在明白你的意思了。无论如何,我一次只希望一个人工作。
      猜你喜欢
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      相关资源
      最近更新 更多