【问题标题】:Multiple clickable views inside listview item列表视图项内的多个可点击视图
【发布时间】:2013-10-01 03:06:48
【问题描述】:

我正在尝试在具有多个选项的 ListView 中创建一个项目;查看和编辑。我想以与 android 的联系人系统完全相同的方式创建它 - 见下文:

我添加了红色框来说明我想要的行为。如果您在左侧红框内按下,您将呼叫该联系人。如果您在右侧的红色框内按,您会向联系人发送短信。我已经在 XML 中创建了类似的布局,但是在代码中实现此功能时遇到了麻烦。

我尝试为项目中的单独布局创建自定义 android:onClick 函数调用,但调用 onClick 方法只允许您将视图作为参数传递,而不是位置。需要使用listview.getItemAtPosition函数的位置,我尝试使用listview.getPositionForView返回位置,但发现这非常不稳定,很容易因为视图回收而返回错误的定位。

然后我尝试在我的适配器的getView 方法中将项目的位置设置为“标签”,如下所示:convertView.setTag(position)。但是在我活动的onClick 方法上,我尝试使用getTag 并将其转换回整数,它总是返回null,我觉得这很令人费解。

实现一个列表的最佳方法是什么,该列表由每个项目上具有多个按钮/布局的项目填充?

【问题讨论】:

标签: android listview


【解决方案1】:

您可以像这样在行中的每个视图上创建一个 onClick 事件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/text_id"
        android:layout_width="0sp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:onClick="textOnClickEvent"/>


    <ImageButton
        android:id="@+id/button_id"
        android:layout_width="@dimen/width_button"
        android:layout_height="match_parent"
        android:onClick="imageOnClickEvent"
        android:src="@android:drawable/ic_menu_delete" />
</LinearLayout>

甚至,在 getView 方法中的每个视图上添加 onClick 侦听器...

有关此here 的更多信息。

【讨论】:

    【解决方案2】:

    在列表视图中,当您定义 getview 方法时,您可以在此处提供单个列表项的所有详细信息。在那里您可以提及每个视图的 onlick 事件。

    【讨论】:

    • 但是 onClickListener 不带int position 参数。如何知道被按下的行的位置?
    • 在您的布局中定义列表视图并将 arrayadapter 分配给列表视图。您将在 arrayadapter 中获得位置。 arrayadapter的getView自带位置号
    【解决方案3】:

    在适配器类中,将View.OnClickListener 添加到getView 方法中:

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
    
        if(view == null) {
            final LayoutInflater layoutInflater = LayoutInflater.from(mContext);
            view = layoutInflater.inflate(R.layout.grid_vendor_item, null);
        }
    
        final TextView textName = (TextView) view.findViewById(R.id.text_id);
        final ImageButton imageProfil = (TextView) view.findViewById(R.id.button_id);
    
        textName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // add your edit codes
            }
        });
    
        imageProfil.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // add your open prodil codes
            }
        });    
        return view;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多