联系人列表在Listview中不按字母顺序排列

时间:2012-06-13 13:53:50

标签: android

我正在使用Android Eclair 2.1平台。

此代码背后的工作是,它将访问模拟器中的所有联系人,并将在列表视图中显示每个联系人,如

联系人姓名,联系电话,电子邮件

此代码有2个问题

  1. 我确实运行了该程序,之后我创建了一个新的联系人,它不会按字母顺序排列
  2. [例如:当我从B开始创建一个名字时,它不会在A之后,而是在最后一个地方]

    2.如果联系人没有电子邮件或号码,它将收到以前联系人的电子邮件或号码

    这是代码

    public class GetAllDatas extends Activity { 
    
    ListView lvItem;
    private Button btnAdd;
    String displayName="", emailAddress="", phoneNumber="";
    ArrayList<String> contactlist=new ArrayList<String>(); 
    ArrayAdapter<String> itemAdapter;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    
    lvItem = (ListView)this.findViewById(R.id.lvitems); 
    btnAdd = (Button)this.findViewById(R.id.btnAddItem);
    
    itemAdapter = new ArrayAdapter<String>    (this,android.R.layout.simple_list_item_1,contactlist);
    lvItem.setAdapter(itemAdapter);
    
    btnAdd.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        readContacts();
    }
    });
    
     } 
    
    private void readContacts()
    {
    ContentResolver cr =getContentResolver();
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null,    null);
    while (cursor.moveToNext()) 
    {
    displayName =Cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)    );       
    String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
    Cursor emails = cr.query(Email.CONTENT_URI,null,Email.CONTACT_ID + " = " + id, null,     null);
    while (emails.moveToNext()) 
    { 
        emailAddress = emails.getString(emails.getColumnIndex(Email.DATA));
        break;
    }
    emails.close();
        if(Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PH    ONE_NUMBER))) > 0)
    {
        Cursor pCur =cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDat     aKinds.Phone.CONTACT_ID +" = ?",new String[]{id}, null);
        while (pCur.moveToNext()) 
        {
             phoneNumber =pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            break;  
        }
        pCur.close();
    }
    
    //  To display the Details
        contactlist.add(displayName+", "+phoneNumber+", "+ emailAddress+"\n");
        itemAdapter.notifyDataSetChanged();
     }
    cursor.close(); 
     }
     }
    

    任何链接或网站可以参考和研究解决这个问题,如果是这样,请将链接发送给我?

3 个答案:

答案 0 :(得分:0)

当您查询数据库时,您缺少orderBy:

public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)

将最后一个null替换为要排序的列:

Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null,    null);

答案 1 :(得分:0)

query方法的最后一个参数需要排序顺序。

请查看文档query (Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

  

sortOrder如何对行进行排序,格式化为SQL ORDER BY子句(不包括ORDER BY本身)。传递null将使用默认的排序顺序,这可能是无序的。

答案 2 :(得分:0)

检查下面的测试代码

package stack.examples;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

public class GetAllDatas extends Activity {

    ListView lvItem;
    private Button btnAdd;
    String displayName="", emailAddress="", phoneNumber="";
    ArrayList<String> contactlist=new ArrayList<String>();
    ArrayAdapter<String> itemAdapter;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       lvItem = (ListView)this.findViewById(R.id.listView_items);  
       btnAdd = (Button)this.findViewById(R.id.btnAddItem);
       itemAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,contactlist);
       lvItem.setAdapter(itemAdapter);
       btnAdd.setOnClickListener(new View.OnClickListener() {
           public void onClick(View v) {
               readContacts();
           }
       });
    }

    private void readContacts()
    {
        ContentResolver cr =getContentResolver();
        Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        while (cursor.moveToNext()) 
        {
            displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));       
            String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            Cursor emails = cr.query(Email.CONTENT_URI,null,Email.CONTACT_ID + " = " + id, null, null);
            while (emails.moveToNext()) 
            { 
                emailAddress = emails.getString(emails.getColumnIndex(Email.DATA));
                break;
            }
            emails.close();
            if(Integer.parseInt(cursor.getString(cursor.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()) 
                {
                     phoneNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    break;
                }
                pCur.close();
            }
                contactlist.add(displayName+","+phoneNumber+","+ emailAddress);

        }
        cursor.close(); 
        sortList(contactlist);
        itemAdapter.notifyDataSetChanged();
    }

    private static void sortList(List<String> aItems){
        Collections.sort(aItems, String.CASE_INSENSITIVE_ORDER);
      }
}

要按字母顺序对ArrayList进行排序,可以使用

Collections.sort(aItems, String.CASE_INSENSITIVE_ORDER);

快乐编码!!!