Tôi đang làm việc trên một ứng dụng mà tôi cần tìm nạp tất cả các số liên lạc từ sổ liên lạc và hiển thị. tôi muốn người dùng chọn một số liên hệ và thêm chúng vào một nhóm được lưu trong db.Không thể tìm nạp danh bạ với các tài khoản gmail đã đồng bộ
tôi đã tạo ra một danh sách tùy chỉnh View- contactitem.xml-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/contactname"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:layout_marginLeft="20dp"
android:ellipsize="end"
android:singleLine="true"
android:clickable="true"/>
<TextView
android:id="@+id/contactnum"
android:layout_width="wrap_content"
android:textColor="@color/White"
android:clickable="true"
android:layout_gravity="center_vertical"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:text="@string/add_contacts"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:focusable="false"
android:focusableInTouchMode="false"/>
</LinearLayout>
tôi có một lớp SelectContact cho lấy danh bạ từ Liên book
public class SelectContacts extends Activity implements OnClickListener{
private String groupName;
private Button back;
private Button home;
private List<Contact> list = new ArrayList<Contact>();
private ListView contactList;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.selectcontacts);
Bundle bundle = getIntent().getExtras();
groupName=bundle.getString("groupName");
back=(Button)findViewById(R.id.back_button);
back.setOnClickListener(this);
home=(Button)findViewById(R.id.home_button);
home.setOnClickListener(this);
contactList=(ListView)findViewById(R.id.contactsListView);
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
cur.moveToFirst();
if (cur.getCount() > 0) {
do{
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) {
String[] fields={ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER};
Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, fields, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);
pCur.moveToFirst();
do {
String number=pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Contact c=new Contact(name,number);
list.add(c);
}while (pCur.moveToNext());
pCur.close();
}
}while (cur.moveToNext());
ContactAdapter contactAdapter=new ContactAdapter(this, R.layout.contactitem, list, contactList,groupName);
contactList.setAdapter(contactAdapter);
}
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent= new Intent();
if(v==back){
Bundle bundle = new Bundle();
bundle.putString("groupName", groupName);
intent.putExtras(bundle);
intent.setClass(SelectContacts.this, GroupDetails.class);
startActivity(intent);
}
if(v==home){
intent.setClass(SelectContacts.this, Welcome.class);
startActivity(intent);
}
}
}
và thực hiện một tùy chỉnh adapter- ContactAdapter- `
public class ContactAdapter extends ArrayAdapter<HashMap<String, Contact>>{
private ArrayList<HashMap<String, Contact>> items;
private LayoutInflater mInflater ;
public ContactAdapter(Context context, int textViewResourceId, ArrayList<HashMap<String, Contact>> items) {
super(context, textViewResourceId, items);
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
mInflater = LayoutInflater.from(getContext());
ViewHolder holder;
if(convertView==null){
convertView = mInflater.inflate(R.layout.contactitem, parent, false);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.contactname);
holder.number = (TextView) convertView.findViewById(R.id.contactnum);
holder.add=(Button)convertView.findViewById(R.id.add);
convertView.setTag(holder);
}
else{
holder=(ViewHolder)convertView.getTag();
}
String name=items.get(position).get(""+position).getContactName();
String number=items.get(position).get(""+position).getContactNum();
holder.name.setText(name);
holder.number.setText(number);
return convertView;
}
static class ViewHolder{
TextView name;
TextView number;
Button add;
}
}
here Contact is a simple POJO-
public class Contact {
private String contactName;
private String contactNum;
public String getContactName() {
return contactName;
}
public void setContactName(String contactName) {
this.contactName = contactName;
}
public String getContactNum() {
return contactNum;
}
public void setContactNum(String contactNum) {
this.contactNum = contactName;
}
}
tôi là một newbie trong android ..
Đoạn mã trên hoạt động tốt yên tĩnh trên emulater và lấy tên liên lạc và số điện thoại để hiển thị trong danh sách. nhưng khi tôi kiểm tra mã này trên điện thoại trong đó có một tài khoản Gmail đồng bộ hoá, nó đã bị rơi với lỗi sau ..
CursorIndexOutOfBoundsException: Index 0 yêu cầu, với kích thước từ 0
tôi không có bất kỳ ý tưởng tại sao điều này đang xảy ra. Vui lòng đưa ra một số đề xuất ...
Có an toàn để giả định rằng bạn đã đặt đúng quyền trong Tệp kê khai không? http://developer.android.com/reference/android/Manifest.permission.html#READ_CONTACTS – Joset
umm tôi nghĩ rằng tôi đã thiết lập đúng tất cả các quyền cần thiết trong huy chương. như sau-- Tôi có cần bất kỳ sự cho phép nào khác không ? –
bạn nhận được lỗi ở đâu? Tôi không thể chắc chắn nhưng tôi có ấn tượng rằng vấn đề nằm trong truy vấn thứ hai của bạn. Nó trông giống như thế này: http://stackoverflow.com/questions/3370628/retrieve-contact-phone-number-from-uri-in-android – kingston