我正在使用以下代码列出向我发送短信的唯一人员列表。它工作正常,但仍然有点慢,需要4到5秒加载,我有650条短信在我的设备任何建议?
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listSMS();
}
private void listSMS()
{
TextView tview = (TextView) findViewById(R.id.list);
Uri uriSMSURI = Uri.parse("content://sms/inbox");
ContentResolver cr= this.getContentResolver();
Cursor cur = cr.query(uriSMSURI, null, null, null, null);
LinkedHashSet contactList= new LinkedHashSet();
String sms = "";
while (cur.moveToNext()) {
if(!contactList.contains(cur.getString(2)))
{
contactList.add(cur.getString(2));
sms += "From :" + getContactName(cur.getString(2),cr)+"\n";
}
}
cur.close();
tview.append(sms);
}
public static String getContactName(String num, ContentResolver cr) {
Uri u = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,Uri.encode(num));
String[] projection = new String[] { ContactsContract.Contacts.DISPLAY_NAME};
Cursor c = cr.query(u, projection, null, null, null);
try {
if (!c.moveToFirst())
return num;
int index = c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
return c.getString(index);
} finally {
if (c != null)
c.close();
}
}
答案 0 :(得分:1)
不是预先准备好名字的联系人列表,然后将其传递给适配器,而是尝试仅使用ID准备列表,然后在适配器内获取相应的名称。这将解决启动延迟,但会使ListView
的滚动速度变慢,这可以通过使用View Holder或某些缓存机制来解决,以防止多次获取相同的名称。另请注意,适配器将查询当前仅对用户可见的联系人姓名。