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>

Activit_cont 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ような、別のインスタンス変数を維持することが理にかなっている場合があります。 mCheckedContactsContactInformationを入れるために呼び出される単純なクラスを作成しArrayListます。

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

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

以下のコードは.equalsメソッドに依存しているため、必ずその.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);

なんで?2つの文字列を受け取るクラスにコンストラクターを作成していないためです。発生したエラーは、実際に発生している問題とほぼ同じです。この種のエラーをグーグルで検索し、見つけた結果を読むのに時間をかけることをお勧めします。残念ながら、このようなことを学ぶには時間がかかります。あなたを助けてくれる人もいますが、ほとんどの作業は、読み取りとコーディング、読み取りとコーディングに何時間も費やすだけで行う必要があります。

あなたが得ている次のエラー:

タイプの不一致:TextViewからStringに変換できません

これが発生しているコード行について考えてみてください。

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

左側は文字列であり、文字列が返されることを期待しています。右側では、文字列を返していません。この種の問題については、Androidのドキュメントを参照すると役立ちます。たとえば、findViewById()関数...それは何を返しますか?View結果の型(である)を、TextView型のオブジェクトであるにキャストしてい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;
  }*/

ここでエラーが発生します - The constructor ContactInformation(String, String) is undefined String name = (TextView) v.findViewById(R.id.txtContactName); .. また、使用するとエラーが発生します - Type mismatch: cannot convert from TextView to String... また、ブール値の選択されたメソッドを使用できますか提案された .equals メソッドの代わりにコメントしましたか??

于 2013-03-01T12:26:18.820 に答える