2015-02-19 2 views
-1

В моем приложении для Android у меня есть класс с именами и номерами телефонов в списке контактов пользователя. У меня также есть счетчик, который перечисляет имена контактов. Когда пользователь выбирает имя из счетчика, я хочу указать Log имя и номер контакта.Как мне записать ключи и значения объекта

Вот MainActivity.java

package com.example.mycompy.myapp; 

import android.content.ContentResolver; 
import android.database.Cursor; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Spinner; 
import android.provider.ContactsContract; 

import java.util.ArrayList; 


public class MainActivity extends ActionBarActivity implements AdapterView.OnItemSelectedListener { 
    // this class will hold contact names and numbers 
    public class ContactInfo { 
     public String contactName, phoneNumber; 

     public ContactInfo(String contactName, String phoneNumber){ 
      this.contactName = contactName; 
      this.phoneNumber = phoneNumber; 
     } 

     @Override 
     public String toString(){ 
      return contactName; 
     } 
    } 

    public Spinner contactSpinner; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ArrayList<ContactInfo> contactList = new ArrayList<ContactInfo>(); 
     ContentResolver cr = getContentResolver(); 
     Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null); // A SQL query for contacts data table, in Java form, I think... 
     contactSpinner = (Spinner) findViewById(R.id.contact_list); 
     contactSpinner.setOnItemSelectedListener(this); 

     // If there are contacts, this code goes 
     if(cur.getCount()>0){ 
      while(cur.moveToNext()){ 
       String id = cur.getString(
         cur.getColumnIndex(ContactsContract.Contacts._ID) 
       ); 
       String name = cur.getString(
         cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME) 
       ); 

       if(
        Integer.parseInt(
          cur.getString(
           cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER) 
          ) 
        ) > 0 
       ){ 
        Cursor pCur = cr.query(
          ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
          null, 
          ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", 
          new String[]{id},null 
        ); 
        while(pCur.moveToNext()){ 
         String phone = pCur.getString(
           pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER) 
         ); 

         // Add contact's info to `contactList` 
         ContactInfo newContact = new ContactInfo(name,phone); 
         contactList.add(newContact); 
         Log.v("onCreate", String.valueOf(newContact)); 
        } 
        pCur.close(); 
       } 
      } 
     } 

     // Add items to spinner 
     ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_spinner_dropdown_item,contactList); 
     contactSpinner.setAdapter(adapter); // Spinner shows contact names only, which is what I want spinner to show 
    } 

    @Override 
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
     parent.getItemAtPosition(pos); 
     Log.v("onItemSelected", String.valueOf(parent.getItemAtPosition(pos))); // When user selects a contact, this Logs just the contact name, but I want contact name AND number 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parent) { 
     // Another interface callback 
    } 

    // Rest of code... 
} 

Как редактировать onItemSelected() так Log s выбранное имя контакта и номер телефона?

+1

Вам не нужно, чтобы показать все это Android-код, когда речь идет только о регистрации информации из вашего класса ContactInfo. –

+0

Сохранить в базе данных? –

ответ

1

Как метод String.valueOf (Object) вызывает метод toString из данного объекта, вы можете просто запрограммировать его для печати именно того, что вы хотите.

Try что-то вроде этого

public class ContactInfo { 
    public String contactName, phoneNumber; 

    public ContactInfo(String contactName, String phoneNumber){ 
     this.contactName = contactName; 
     this.phoneNumber = phoneNumber; 
    } 

    @Override 
    public String toString(){ 
     return contactName + " - " + phoneNumber; 
    } 
} 
+0

Вы также должны добавить геттеры для имени и номера, иначе рано или поздно кто-то попытается проанализировать возвращаемое значение toString, чтобы получить отдельные фигуры. Я думаю, что Джош Блох говорит об этом в * Эффективной Java *, возможно, в пункте 10 или пункте 50. –

+0

@Patrick Правильно, но я хочу, чтобы spinner отображал только имена, а Log показывает имя и номер. С вашим кодом, счетчик показывает оба. Есть ли способ, чтобы spinner показывал только имена, в то время как «Журнал» показывает оба? –

+0

@Generic_User_ID Вы можете использовать подкласс «Adapter» для счетчика, который использует это имя вместо использования команды toString(). – CurlyCorvus

Смежные вопросы