【问题标题】:Make a whole ListView row clickable使整个 ListView 行可点击
【发布时间】:2014-04-25 13:09:21
【问题描述】:

我正在为安卓开发一个小应用程序。我将 ListView 与 TextView 和 CheckBox 一起使用。
我已经可以处理 CkeckBox 刻度线了。此外,我想让 ListView 的整行都可以点击,但我找不到任何方法来实现这一点。 我已经尝试通过以下方式使 ListView 可点击:

android:clickable="true"

我还用 ListView 的这段代码进行了尝试:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Toast.makeText(null,"Clicked",Toast.LENGTH_LONG
    }
});

这是我的 ListView 代码:

<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"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="de.matthias.lolchampionowner.app.ChampionActivity">

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/championListView"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="true" />

</RelativeLayout>

就像 whatsapp 一样。使用 Android Studio,我可以发现这也是一个 ListView,但它的代码过于模糊,无法从中得到任何东西。
这是一张图片:WhatsApp ListView

我不知道如何实现它。我希望有任何帮助。


这是来自 nKn 的答案:

你必须重写 getView 方法。这是我的代码,我可以同时处理来自 ListView 和 CheckBox 的点击:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null) {
        convertView = inflater.inflate(R.layout.row_name_check, null);
        holder = new ViewHolder();
        holder.textView = (TextView) convertView.findViewById(R.id.textViewRow);
        holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBoxRow);
        convertView.setTag(holder);
    }
    holder = (ViewHolder) convertView.getTag();
    final ChampionActivity.EachRow row = this.getItem(position);
    row.checked = ItemStorage.getChampSkinOwned(row.text);
    holder.textView.setText(row.text);
    holder.checkBox.setChecked(row.checked);
    holder.checkBox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(((CheckBox)v).isChecked()) {
                ItemStorage.setChampSkinOwned(row.text, true);
            } else {
                ItemStorage.setChampSkinOwned(row.text, false);
            }
        }
    });
    convertView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("onClick", row.text + " clicked");
            //Toast.makeText(null,"Clicked",Toast.LENGTH_LONG);
        }
    });
    return convertView;
}

【问题讨论】:

  • 很棒的图片,也许这里和那里有点黑,很完美;-)
  • 哈哈是的。但我不希望整个互联网看到所有数字 :) 但我想你知道我想用它展示什么
  • setOnItemClickListener() 应该做你除了。为我工作...
  • 实际问题是复选框,它带走了listview的正常项目点击行为。尝试使用仅包含文本的简单列表视图,您会发现 OnItemClickListener 将起作用。然后在此处查找有关如何使列表视图中的复选框起作用的答案。
  • 如果我使用示例代码,它就可以工作。 :)

标签: android listview android-listview clickable


【解决方案1】:

我也遇到了同样的问题,我必须更改它以获得所需的结果。 在 ListView(不是列表项)的代码中,将其更改为

android:layout_width="match_parent"

希望这对你们也有用

【讨论】:

    【解决方案2】:

    最好的办法可能是扩展ArrayAdapter 并覆盖getView() 方法。这个方法的第二个参数是一个View(通常叫convertView,但不一定),模糊的说就是一行的表示,所以每一行都会调用这个方法。只需在上面声明您的onClickListener()

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
      ...
    
      convertView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
          ...
        }
      });
    
      ...
    }
    

    【讨论】:

    • 没有 setOnItemClickListener 而是一个 setOnClickListener。我用过这个,效果很好。但它仍然没有显示“正常”背景更改为蓝色。有什么方法我必须启用它还是我必须对其进行编码?
    • 如果所选行没有突出显示,您可以在列表视图上放置一个自定义选择器。 stackoverflow.com/questions/2562051/…
    【解决方案3】:

    将 ListView layout_width 更改为“fill_parent”,如下所示

    <ListView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            ... />
    

    【讨论】:

      【解决方案4】:

      只使用

      android:layout_width="match_parent"
      

      【讨论】:

        猜你喜欢
        • 2016-08-03
        • 1970-01-01
        • 2016-04-25
        • 2018-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        相关资源
        最近更新 更多