【问题标题】:Can't set multiple choice selection in ListView无法在 ListView 中设置多项选择
【发布时间】:2012-09-02 21:23:31
【问题描述】:

我在 ListView 中设置多项选择时遇到问题。我的 ListView 有从 android 手机中检索到的联系人姓名。

我遵循了设置多项选择的示例,但没有成功。

我试过打字

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contacts_list, c, columns, views);
        list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        this.setListAdapter(adapter);

但我在 ListView 中看不到复选框。

我已将R.layout.contacts_list 替换为android.R.layout.simple_list_item_multiple_choice,它显示了复选框,但没有来自Android 手机联系人的姓名。

这是我的代码: 联系人列表.xml

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

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:stackFromBottom="false"
        android:transcriptMode="normal"
        android:choiceMode="multipleChoice" >
    </ListView>

    <TextView
        android:textColor="@color/dark_purple"
        android:id="@+id/contactName"
        android:textStyle="bold"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

ContactsList.java

public class ContactsList extends ListActivity
{
    final Context context = this;

    Cursor cursor;

    String[] buddiesList = 
        {"Kanak Priya",
        "Joanne Liew",
        "Michelle Lam",
        "Teo Kin Hua",
        "Melissa Haiting",
        "David Yeo",
        "Natasha Akhbar",
        "Gillian Gan",
        "Sonia",
        "Ms Long",
        "Joan Tang",
        "Stephanie",
        "Nur Ashiqin"
        };

    BuddyDBAdapter buddyDB = new BuddyDBAdapter(this);

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.contacts_list);

        ListView list = getListView();



        setListAdapter(new ArrayAdapter<String> (this, R.layout.contacts_list, R.id.contactName, buddiesList));

        Uri allContacts = Uri.parse("content://contacts/people");

        Cursor c = managedQuery(allContacts, null, null, null, null);

        String[] columns = new String[] {ContactsContract.Contacts.DISPLAY_NAME};
        int[] views = new int[]  {R.id.contactName};

        startManagingCursor(c);

        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contacts_list, c, columns, views);
        list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        this.setListAdapter(adapter);


        /*if(cursor.getCount()<0)
        {
            Intent displayIntent = new Intent(Intent.ACTION_VIEW);
            displayIntent.setData(Uri.parse("content://contacts/people"));
            startActivity(displayIntent);

            displayIntent = new Intent(Intent.ACTION_VIEW);
            //displayIntent.setData(Uri.parse("content://contacts/people/"+id));
            startActivity(displayIntent);
        }
        else
        {
            final AlertDialog alertDialog = new AlertDialog.Builder(this).create();
            alertDialog.setTitle("ALERT!");
            alertDialog.setMessage("NO Name is Found! D:");
            alertDialog.setIcon(R.drawable.warning);
            alertDialog.setButton("OK", new DialogInterface.OnClickListener()
            {
                public void onClick(DialogInterface dialog, int which)
                {
                    Intent backIntent = new Intent(context, ContactsList.class);
                    startActivity(backIntent);
                }
            });
            alertDialog.show();
        }*/
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id)
    {
        buddyDB.open();
        long name_id;
        super.onListItemClick(l, v, position, id);


        Cursor c = ((SimpleCursorAdapter)l.getAdapter()).getCursor();

        TextView contactName = (TextView) v.findViewById(R.id.contactName);
        String NameValue = contactName.getText().toString();

        name_id = buddyDB.insertNames(NameValue);


        Toast.makeText(getBaseContext(),
                "Selected: " + buddiesList[position], Toast.LENGTH_SHORT).show();


        buddyDB.close();

顺便说一句,

String[] buddiesList = 
        {"Kanak Priya",
        "Joanne Liew",
        "Michelle Lam",
        "Teo Kin Hua",
        "Melissa Haiting",
        "David Yeo",
        "Natasha Akhbar",
        "Gillian Gan",
        "Sonia",
        "Ms Long",
        "Joan Tang",
        "Stephanie",
        "Nur Ashiqin"
        };

用于我的 Toast 消息。

我真的需要这方面的帮助。任何帮助将不胜感激。示例也将不胜感激。
谢谢

【问题讨论】:

    标签: java android listview checkbox contacts


    【解决方案1】:

    您可能有两种选择:

    1 - 使用 Android 资源中的默认布局 (simple_list_item_multiple_choice)

    您可以替换此代码:

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.contacts_list, c, columns, views);
    

    到:

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_multiple_choice, c, columns, new int {android.R.id.text1});
    

    2 - 创建包含您定义的复选框的新行布局并自行处理。

    contact_list.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:background="@color/light_goldenrod"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:stackFromBottom="false"
            android:transcriptMode="normal"
            android:choiceMode="multipleChoice" >
        </ListView>
    </LinearLayout>
    

    contact_entry.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="fill_parent"
                  android:layout_height="wrap_content">
        <TextView
            android:textColor="@color/dark_purple"
            android:id="@+id/contactName"
            android:textStyle="bold"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <CheckBox
            android:id="@+id/contactCheckbox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:checked="false" />
    
    </LinearLayout>
    

    像这样添加自定义光标适配器:

    public class YourCursorAdapter extends CursorAdapter  {
    
    private Context mContext;
    private Cursor mCurser;
    
    public YourCursorAdapter(Context context, int layout, Cursor c, String[] from,
            int[] to, ContentResolver co) {
        super(context, c);
        mCurser = c;
        mContext = context;
    }
    
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        // TODO Auto-generated method stub
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View v = inflater.inflate(R.layout.contact_entry, parent, false);
        bindView(v, mContext, cursor);
        return v;
    }
    
    @Override
    public void bindView(View view, Context context, Cursor cursor) {
    
        TextView contactName= (TextView)view.findViewById(R.id.contactName);
        contactName.setText(cursor.getString((mCurser
                .getColumnIndexOrThrow(Contacts.Phones.DISPLAY_NAME))));
        CheckBox contactCheckbox = (TextView)view.findViewById(R.id.contactCheckbox);
        contactCheckbox.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                Checkbox checkBox = (Checkbox) v.findViewById(R.id.contactCheckbox)
                if (checkBox.isChecked())
                        checkBox.setChecked(false);
                else
                        checkBox.setChecked(true);
            }
        });
    }
    

    在您的 ListActivity 中:

        YourCursorAdapter adapter = new YourCursorAdapter(this,
                null, c, null, null,null);
        this.setListAdapter(adapter);
    

    【讨论】:

    • 嗨,我会试试你的代码。如果我有任何问题,我会告诉你。谢谢你的回答。
    • 我需要在Android资源--res文件夹中创建simple_list_item_multiple_choice吗?
    • 没有。但它会附带Android系统默认的listview行。如果你想实现你自己的列表视图的行,你必须通过添加复选框来重新定义 res/layout 文件夹中的 contacts_list.xml。
    • 我已将复选框添加到列表视图中。但复选框位于列表视图的底部。我不希望它位于列表视图的底部,我只想位于每个名称下方。我不知道该怎么做。
    • 你的contacts_list.xml中有一些奇怪的东西。您应该使用列表视图在单独的布局中创建列表视图的行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    相关资源
    最近更新 更多