SMS Listview主题

时间:2014-04-05 14:08:00

标签: java android sms contacts

我目前有一个基本程序,它贯穿所有SMS,并为每个只创建一个只存储名称,编号和最后文本的线程。然后它会从所有这些线程中创建一个列表视图(比如股票短信应用程序).​​.....但它运行速度很慢;我怎么能让它更有效率,所以每次启动都不需要几分钟?

Uri message = Uri.parse("content://sms/");
ContentResolver cr = this.getContentResolver();

Cursor c = cr.query(message, null, null, null, null);
this.startManagingCursor(c);
int totalSMS = c.getCount();
        if (c.moveToFirst()) {
         for (int i = 0; i < totalSMS; i++) {
                String[] projection = new String[] {ContactsContract.PhoneLookup.DISPLAY_NAME,ContactsContract.PhoneLookup._ID};
                Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(c.getString(c.getColumnIndexOrThrow("address"))));
                Cursor cursor2 = this.getContentResolver().query(contactUri, projection, null, null, null);
                String name = getContactName(this, c.getString(c.getColumnIndexOrThrow("address")));
                String number = c.getString(c.getColumnIndexOrThrow("address"));
                String msg =c.getString(c.getColumnIndexOrThrow("body"));
                if (cursor2.moveToFirst()) {

                    // Get values from contacts database:
                    //contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup._ID));
                    name =      cursor2.getString(cursor2.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
                }

                //entries.add(new Entry(name, msg));
                int newNumber = 1;
                for(int d = 0; d < threads.size(); d++)
                {
                    Thread t = threads.get(d);
                    if(t.number.equals(number))
                        newNumber = 0;
                }
                if(newNumber == 1)
                    threads.add(new Thread(name, number, msg));

                c.moveToNext();
            }
        }

2 个答案:

答案 0 :(得分:0)

您可以通过使用无限的Adapter实现来实现此目的。这正是你想要的。您还可以限制每个滚动要刷新的行数。这是一个链接。,

Android:Implementing Endless List like Android Market

https://github.com/commonsguy/cwac-endless

要使用它,您可以扩展EndlessAdapter以提供有关如何处理无尽的详细信息。具体来说,您需要能够提供独立于实际适配器中任何行的行View,它将用作占位符,而在另一种方法中,您将实际数据加载到主适配器。然后,在您的帮助下,它可以无缝转换新数据。

或者您可以创建一个简单的lazyAdapter,它将在需要时加载数据。

更新1:

使用Cursor loader有效地从数据库加载数据。 Here是示例代码

答案 1 :(得分:0)

不要读取光标中的所有列。只需读取光标您想要的列。

<强>示例

cr.query(uri, new String[]{"address","body"},null, null, null);

注意
在处理游标时,不要忘记关闭游标      将时间减少50%但不完整。