无法在ListView中设置多项选择

时间:2012-09-10 01:34:51

标签: java android listview checkbox contacts

我在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手机联系人的姓名。

以下是我的代码: contacts_list.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消息。

我真的需要帮助。任何帮助将不胜感激。例子也将非常感激。
感谢

1 个答案:

答案 0 :(得分:3)

您可以有两种选择:

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);