【发布时间】:2016-04-07 05:25:22
【问题描述】:
我正在开发一个即时聊天消息应用程序。我正在从电话中获取联系人并将它们显示在活动的列表视图中。但这需要 25-30 秒。我正在使用以下代码:
1.点击联系按钮时:
contacts.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(getApplicationContext(), "Contacts Clicked", Toast.LENGTH_SHORT).show();
popupWindow.dismiss();
ArrayList<Bean_PhoneNumbers> listBeanPhone = getContactsFromPhone();
Intent intent = new Intent(SingleChatActivity.this, PhoneBookActivity.class);
//intent.putExtra("listBeanPhone", listBeanPhone);
intent.putParcelableArrayListExtra("listBeanPhone", listBeanPhone);
intent.putExtra("friendName", friendName);
intent.putExtra("absoluteURL", completeURLFriend);
intent.putExtra("friendID", frndID);
startActivity(intent);
}
});
2。 getContactFromPhone() 方法
private ArrayList<Bean_PhoneNumbers> getContactsFromPhone() {
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
bean_phoneNumbers = new Bean_PhoneNumbers();
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 phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
// Toast.makeText(SingleChatActivity.this, "Name: " + name + ", Phone No: " + phoneNo, Toast.LENGTH_SHORT).show();
bean_phoneNumbers.setName(name);
bean_phoneNumbers.setPhoneNumber(phoneNo);
listBeanPhoneNumbers.add(bean_phoneNumbers);
}
pCur.close();
}
}
}
return listBeanPhoneNumbers;
}
3.PhoneBookActivity.java
public class PhoneBookActivity extends AppCompatActivity implements SearchView.OnQueryTextListener {
private ViewPager viewPager;
private SearchView searchView;
private ListView listView;
private Adapter_PhoneBook adapter_phoneBook;
private String friendName, completeURLFriend, frndID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_phonebook);
//findViewByID
searchView = (SearchView) findViewById(R.id.search);
listView = (ListView) findViewById(R.id.list);
// Fetching data from a parcelable object passed from SingleChatActivity
ArrayList<Bean_PhoneNumbers> listBeanPhone = getIntent().getParcelableArrayListExtra("listBeanPhone");
for (int i = 0; i < listBeanPhone.size(); i++) {
Bean_PhoneNumbers bean = listBeanPhone.get(i);
String name = bean.getName();
Log.e("Name", name);
}
//Initialization
adapter_phoneBook = new Adapter_PhoneBook(PhoneBookActivity.this, listBeanPhone);
listView.setAdapter(adapter_phoneBook);
searchView.setOnQueryTextListener(this);
//Getting values from previos screen(ChatFragment)
Bundle bundle = getIntent().getExtras();
friendName = bundle.getString("friendsName", null);
completeURLFriend = bundle.getString("absoluteURL", null);
frndID = bundle.getString("friendID");
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Bean_PhoneNumbers bean_phoneNumbers = (Bean_PhoneNumbers) adapterView.getItemAtPosition(i);
Intent intent = new Intent(PhoneBookActivity.this, SingleChatActivity.class);
intent.putExtra("bean", bean_phoneNumbers);
intent.putExtra("friendName", friendName);
intent.putExtra("absoluteURL", completeURLFriend);
intent.putExtra("friendID", frndID);
startActivity(intent);
}
});
}
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String s) {
adapter_phoneBook.getFilter().filter(s);
return false;
}
}
请检查我的代码并告诉我哪里做错了。我从手机获取联系人并存储在 ArrayList 中。然后我将该数组列表传递给具有 listview 的 PhoneBookActivity。我使用 BaseAdapter 填充 listview。
【问题讨论】:
-
将您的数组列表转换为字符串,然后将其转移到另一个活动中。尝试一次
-
如果没有成功,则第一时间从用户的联系人列表中获取联系人并将其存储在sqlite中。因为从 sqlite 应用程序可以更轻松地获取数据。并且当用户更新他的联系人列表时也应用一个条件,然后 sqlite 成为数据库表的更新。
-
@MKJParekh:我已经移动了我的问题代码审查。请检查它。
-
@MKJParekh:感谢您抽出宝贵的时间。
-
一个简单的技巧,开始使用
CursorAdapter