使整个ListView行可单击

时间:2014-04-25 13:09:21

标签: android listview android-listview clickable

我正在为android开发一个小应用程序。我使用带有TextView和CheckBox的ListView 我已经可以处理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>
像phatsapp那样做了。使用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;
}

4 个答案:

答案 0 :(得分:9)

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

android:layout_width="match_parent"

希望这对你们也有用

答案 1 :(得分: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) {
      ...
    }
  });

  ...
}

答案 2 :(得分:1)

将ListView layout_width更改为&#34; fill_parent&#34;如下所示

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

答案 3 :(得分:-1)

仅使用

android:layout_width="match_parent"