【问题标题】:Problems clicking List Items with checkboxes单击带有复选框的列表项时出现问题
【发布时间】:2013-08-07 20:45:45
【问题描述】:

我一直在研究一种“收藏”列表项目的方法,我有一个 ListView 带有复选框,所有内容都可以正常显示。

我的问题是我需要该复选框可单击并将列表项设置为选中,并且单独我应该能够单击列表项以启动新活动。

目前,单击复选框会按应有的方式更改图标,但不会将其设置为选中状态,而单击列表项会将其设置为选中状态。

在当前的代码中,我没有包含在单击项目时启动新活动的意图;我现在只想在单击复选框时“选中”该项目。

AndroidListViewActivity.java:

package com.androidlistview;

import android.app.Activity;
import android.os.Bundle;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

public class AndroidListViewActivity extends Activity {

    ListView myList;
    Button getChoice;

    String[] listContent = {
            "January",
            "February",
            "March",
            "April",
            "May",
            "June",
            "July",
            "August",
            "September",
            "October",
            "November",
            "December"
    };

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myList = (ListView)findViewById(R.id.list);
        getChoice = (Button)findViewById(R.id.getchoice);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.single_item, listContent);

        myList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        myList.setAdapter(adapter);

        getChoice.setOnClickListener(new Button.OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                String selected = "";

                int cntChoice = myList.getCount();
                SparseBooleanArray sparseBooleanArray = myList.getCheckedItemPositions();
                for(int i = 0; i < cntChoice; i++){
                    if(sparseBooleanArray.get(i)) {
                        selected += myList.getItemAtPosition(i).toString() + "\n";

                    }
                }

                Toast.makeText(AndroidListViewActivity.this, 
                        selected, 
                        Toast.LENGTH_LONG).show();
            }});

    }
}

ma​​in.xml:

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

<Button
    android:id="@+id/getchoice"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Get Choice" />

<ListView 
    android:id="@+id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" />

</LinearLayout>

list_item.xml

<?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="50dp"
    android:orientation="horizontal" >

        <CheckBox
            android:id="@+id/check_favourites"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:focusable="false" />

        <TextView
            android:id="@+id/single_item"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:background="#ffffff"
            android:padding="8dp"
            android:textColor="#000000"
            android:textSize="20sp"
            android:layout_gravity="right" />

</LinearLayout>

【问题讨论】:

    标签: android listview checkbox


    【解决方案1】:

    你的问题是你声明ArrayAdapter的方式

    而不是这样做:

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
        R.layout.list_item, R.id.single_item, listContent);
    

    使用这个:

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_list_item_multiple_choice, listContent);
    

    编辑:

    对于自定义适配器行为,您必须创建自己的 Adapter

    然后您可以为复选框添加onCheckedChangedListener,为项目点击添加onClickListener

    类似的例子见here

    【讨论】:

    • 啊,感谢您的快速回复。但是,这是默认外观,我使用 list_item.xml 声明自定义外观,我在问题中提供了代码
    • 好的,我看过这个例子,它并没有真正改善我已经拥有的东西,但是感谢你找到它。我对android很陌生,我有点希望不必制作自己的适配器,你确定没有简单的事情,例如。 listView.setItemsCanFocus 我错过了什么?
    • 我不知道。你现在基本上在做的是试图让 Android 知道它应该作为一个具有多项选择的列表,同时告诉他这是一个正常的列表。因此它不会区分您的按钮和复选框。在我看来,自定义适配器似乎是唯一的方法,因为您需要列表中一行的自定义行为。
    • 好的,感谢您的帮助。我会尝试让它工作,并给它一点时间看看是否有人有其他答案,然后我会将您的答案设置为感谢您的帮助!
    • 您找到更好的答案了吗?如果没有,请投票并接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多