0

我将联系人加载到带有复选框的列表视图中,现在我想返回仅选中的联系人的详细信息,例如姓名和电话号码。我将如何获取详细信息?存储在列表视图中的详细信息(例如位置、id 等)在哪里。给出以下代码

String[] from = { "Name", "Phone","chkbox" };
        int[] to = { R.id.txtContactName, R.id.txtContactNumber,R.id.checkBox1 };
        ArrayList<Map<String,String>> list=buildData();
        SimpleAdapter adapter = new SimpleAdapter(this, list,
                R.layout.main, from, to);
        setListAdapter(adapter);

private ArrayList<Map<String,String>> buildData() {
        ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
        list.clear();
        Cursor people = getContentResolver().query(
                ContactsContract.Contacts.CONTENT_URI, null, null, null,
                "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME + ") ASC");
        while (people.moveToNext()) {
            String contactName = people.getString(people
                    .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            String contactId = people.getString(people
                    .getColumnIndex(ContactsContract.Contacts._ID));
            String hasPhone = people
                    .getString(people
                            .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
            if ((Integer.parseInt(hasPhone) > 0)) {
                Cursor phones = getContentResolver().query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                + " = " + contactId,
                        null,
                        "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME
                                + ") ASC");
                while (phones.moveToNext()) {
                    String phoneNumber = phones
                            .getString(phones
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    Map<String, String> NamePhoneType = new HashMap<String, String>();
                    NamePhoneType.put("Name", contactName);
                    NamePhoneType.put("Phone", phoneNumber);
                    list.add(NamePhoneType);
                     aa=contactName;
                     bb=phoneNumber;
                }
                phones.close();
            }
        }
        people.close();
        return list;
    }


@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {

        super.onListItemClick(l, v, position, id);
        CheckBox checkbox = (CheckBox) v.findViewById(R.id.checkBox1); 

        if (checkbox.isChecked() == false) {
            checkbox.setChecked(true); 
           int aaa=l.getCheckedItemPosition();

        } else {
            checkbox.setChecked(false); 
        }

    }

xml代码

主要 XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="5.0px"
android:paddingLeft="5.0px"
android:paddingTop="5.0px" >

<TextView
android:id="@+id/txtContactName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="15.0dip"
android:layout_toLeftOf="@+id/checkBox1"
android:layout_alignParentLeft="true"
android:text="Medium Text"
android:textAppearance="?android:textAppearanceMedium" />

<TextView
android:id="@+id/txtContactNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/txtContactName"
android:layout_alignParentLeft="true"
android:layout_marginLeft="15.0dip"
android:layout_toLeftOf="@+id/checkBox1"
android:text="Small Text"
android:textAppearance="?android:textAppearanceSmall" />

<CheckBox
android:id="@+id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false" />

</RelativeLayout>

活动控制 xml

<?xml version="1.0" encoding="utf-8"?>
<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" >

<Button
android:id="@+id/btnShow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Show Selected" />

<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:clickable="true"
android:layout_below="@+id/btnShow" >
</ListView>
</RelativeLayout>
4

2 回答 2

0

首先,我想建议您应该扩展getView列表适配器的方法(阅读该方法),并在此范围内对我的建议做一些变化,但只是为了让您摆脱困境,这是一种合并的方法这进入你的代码。我肯定会推荐使用更具描述性的变量名:)

同时:

如果您想要在任何给定时间点已检查的所有人员(及其人数)的列表,则维护一个单独的实例变量可能是有意义的ArrayList- 类似的东西mCheckedContacts被添加到复选框被选中. 我会创建一个简单的类ContactInformation来放入ArrayList.

public class ContactInformation {
  private String mName;
  private String mPhoneNumber;

  //make some getters and setters, a constructor, and an equals method!
}

确保实现该 .equals 方法,因为下面的代码依赖于它(请参阅:http: //developer.android.com/reference/java/util/ArrayList.html#remove(java.lang.Object)以供参考)。现在您可以拥有以下内容ArrayList

ArrayList<ContactInformation> mCheckedContactsInformation = new ArrayList<ContactInformation>();

这可以添加到您的代码中,并且您可以在此列表中添加和删除联系人。

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
  super.onListItemClick(l, v, position, id);
  CheckBox checkbox = (CheckBox) v.findViewById(R.id.checkBox1); 
  String name = (TextView) v.findViewById(R.id.txtContactName); 
  String phoneNumber = (TextView) v.findViewById(R.id.txtContactNumber); 

  checkbox.setOnCheckedChangedListener(
    new OnCheckedChangedListener() {
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        ContactInformation curContactInfo = new ContactInformation(name, phoneNumber);
        if (isChecked) mCheckedContactsInformation.add(curContactInfo);
        //And this is why you need to implement a .equals method!
        else mCheckedContactsInformation.remove(curContactInfo);
      }
  }

  checkbox.setChecked(! checkbox.isChecked());
}

现在您应该能够利用该 ArrayList 来获取您需要的信息。


编辑:根据您自己的回答,您可能需要对其中一些主题进行进一步解释。

:一个类必须有一个构造函数。构造函数是实例化对象的方式。每当您拨打这样的电话时:

Object o = new Object(int thisCouldBeAnyTypeOfParameter);

您正在调用Object类中的方法,如下所示:

public Object(int thisCouldBeAnyTypeOfParameter) {
  //here is some initialization code that someone wrote, or nothing...
  //but this method NEEDS to exist!

  //And if a parameter is passed, like the int above, then it is probably used to init something
}

有关更多信息(可能还有更好的解释),请直接从源代码中查看此信息。因此,当您收到此错误时:

构造函数 ContactInformation(String, String) 未定义

这很可能在线上发生:

ContactInformation curContactInfo = new ContactInformation(name, phoneNumber);

为什么?因为您尚未在接受两个 Strings 的类中创建构造函数。你得到的错误实际上几乎就是正在发生的问题。我建议您搜索这些类型的错误并花时间阅读您找到的结果。不幸的是,这些东西需要时间来学习,虽然有人会帮助你,但大部分工作都必须由你完成,只需花费数小时阅读和编码,阅读和编​​码。

您收到的下一个错误:

类型不匹配:无法从 TextView 转换为 String

想想发生这种情况的代码行:

String name = (TextView) v.findViewById(R.id.txtContactName);

左边是一个字符串,期望返回一个字符串。在右侧,您没有返回字符串。对于此类问题,查看 Android 文档会有所帮助。例如,findViewById()函数......它返回什么?您正在将结果类型(即 a View)转换为 aTextView类型的 Object TextView。这不是字符串,因此您会收到错误,因为您试图将TextView对象分配给String. 这是有道理的,因为它们是不同的类型,所以这不起作用。在这种情况下,您需要做一些额外的工作才能将字符串(存储在 TextView 对象中)从对象中取出,以便将其分配给字符串。我将把这个额外的工作留给你来确定,但是在谷歌上搜索“textview android”,点击第一个链接,然后查看所有可以在 TextView 上调用的方法。我打赌你会找到一个返回字符串的:)

希望这可以帮助。很抱歉这么啰嗦/说教,但我只是想帮忙。

于 2013-02-06T06:00:35.467 回答
-1
        String[] from = { "Name", "Phone","chkbox" };
        int[] to = { R.id.txtContactName, R.id.txtContactNumber,R.id.checkBox1 };
        ArrayList<Map<String,String>> list=buildData();
        SimpleAdapter adapter = new SimpleAdapter(this, list,
                R.layout.main, from, to);
        setListAdapter(adapter);




    }

    private ArrayList<Map<String,String>> buildData() {
        ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
        list.clear();
        Cursor people = getContentResolver().query(
                ContactsContract.Contacts.CONTENT_URI, null, null, null,
                "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME + ") ASC");
        while (people.moveToNext()) {
            String contactName = people.getString(people
                    .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            String contactId = people.getString(people
                    .getColumnIndex(ContactsContract.Contacts._ID));
            String hasPhone = people
                    .getString(people
                            .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
            if ((Integer.parseInt(hasPhone) > 0)) {
                Cursor phones = getContentResolver().query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                + " = " + contactId,
                        null,
                        "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME
                                + ") ASC");
                while (phones.moveToNext()) {
                    String phoneNumber = phones
                            .getString(phones
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    Map<String, String> NamePhoneType = new HashMap<String, String>();
                    NamePhoneType.put("Name", contactName);
                    NamePhoneType.put("Phone", phoneNumber);
                    list.add(NamePhoneType);
                    aa=contactName;
                     bb=phoneNumber;
                }
                phones.close();
            }
        }
        people.close();
        return list;
    }

    ArrayList<ContactInformation> mCheckedContactsInformation = new ArrayList<ContactInformation>();

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {

        super.onListItemClick(l, v, position, id);


        CheckBox checkbox = (CheckBox) v.findViewById(R.id.checkBox1); 
        // String name = (TextView) v.findViewById(R.id.txtContactName);
        TextView tvv1=(TextView) findViewById(R.id.txtContactName);
        TextView tvv2=(TextView) findViewById(R.id.txtContactNumber);
        final String name=tvv1.getText().toString();
        final String phoneNumber=tvv2.getText().toString();

checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    ContactInformation curContactInfo = new ContactInformation(name, phoneNumber);
    if (isChecked) mCheckedContactsInformation.add(curContactInfo);
    //And this is why you need to implement a .equals method!
    else mCheckedContactsInformation.remove(curContactInfo);

}
});

联系信息类代码

private String name;
private String phoneNo;
//private boolean selected;

public String getName() {
    return name;

}
public void setName(String name) {
    this.name = name;
     //selected = false;
}
public String getPhoneNo() {
    return phoneNo;
}
public void setPhoneNo(String phoneNo) {
    this.phoneNo = phoneNo;
}

/*public boolean isSelected() {
    return selected;
  }

  public void setSelected(boolean selected) {
    this.selected = selected;
  }*/

在这里我收到错误-构造函数ContactInformation(String,String)未定义..当我使用String name = (TextView) v.findViewById(R.id.txtContactName); 时我收到错误-类型不匹配:无法从TextView转换为字符串...我也可以使用布尔选择的方法我已经评论而不是您建议的 .equals 方法?

于 2013-03-01T12:26:18.820 回答