android应用程序中有8000个联系人

android应用程序中有8000个联系人,android,android-contacts,Android,Android Contacts,应用程序需要读取电话簿联系人并将其显示给用户,手机上有8000多个联系人。 问题是它在屏幕上呈现所有联系人时会被卡住很长时间 请建议完成此任务的最佳方法。谢谢 主要方法: Cursor contactsCursor = getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null); LogUtils.d("@@@ cursorCount" + contacts

应用程序需要读取电话簿联系人并将其显示给用户,手机上有8000多个联系人。 问题是它在屏幕上呈现所有联系人时会被卡住很长时间

请建议完成此任务的最佳方法。谢谢

主要方法:

 Cursor contactsCursor = getContentResolver().query(
        ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
LogUtils.d("@@@ cursorCount" + contactsCursor.getCount());
contacts = new ArrayList<ImportContactModel>();
importContactList = new ArrayList<ImportContactModel>();
showProgressDialog();
asyncLoader = new AsyncTask<Void, Void, Void>() {

    @Override
    protected Void doInBackground(Void... params) {
        fetchContacts();
        return null;
    }

    protected void onPostExecute(Void result) {
        // create an array of Strings, that will be put to our
        // ListActivity
        adapter = new ImportContactArrayAdapter(
                ImportContactSelection.this, contacts);
        contactList.setAdapter(adapter);
        contactList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        initSearch();
        dismissProgressDialog();
    };

}.execute();
} 适配器类

   public class ImportContactArrayAdapter extends ArrayAdapter<ImportContactModel> {

  private final List<ImportContactModel> list;
  private final Activity context;
  private ImageLoader mImageLoader;

  public ImportContactArrayAdapter(Activity context, List<ImportContactModel> list) {
super(context, R.layout.item_task_contact_select, list);
this.context = context;
this.list = list;
this.mImageLoader = ImageLoader.getInstance();
 }

 static class ViewHolder {
protected ImageView profilePic;
protected TextView contactName;
protected TextView contactNo;
protected CheckBox checkbox;
}

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  View view = null;
  if (convertView == null) {
  LayoutInflater inflator = context.getLayoutInflater();
  view = inflator.inflate(R.layout.item_task_contact_select, null);
  final ViewHolder viewHolder = new ViewHolder();
  //viewHolder.profilePic = (ImageView) view.findViewById(R.id.img_import_profilePic);
  viewHolder.contactName = (TextView) view.findViewById(R.id.name_text);
  viewHolder.contactNo = (TextView)view.findViewById(R.id.tag_text_1);
  viewHolder.contactNo.setVisibility(View.VISIBLE);
  viewHolder.contactNo.setTextSize(11);
  viewHolder.checkbox = (CheckBox) view.findViewById(R.id.select_checkbox);
  viewHolder.checkbox.setClickable(true);
  viewHolder.checkbox
      .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {
            ImportContactModel element = (ImportContactModel) viewHolder.checkbox
              .getTag();
          element.setSelected(buttonView.isChecked());

        }
      });
  view.setTag(viewHolder);
  viewHolder.checkbox.setTag(list.get(position));
} else {
  view = convertView;
  ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
}
ViewHolder holder = (ViewHolder) view.getTag();
ImageView avatar = (ImageView) view.findViewById(R.id.img_avatar);
ImageView avatarBorder = (ImageView) view.findViewById(R.id.img_avatar_overlay);
ProgressBar avatarProgress = (ProgressBar) view.findViewById(R.id.img_avatar_progress);

if(!list.get(position).equals(""))
//holder.profilePic.setImageURI(Uri.parse(list.get(position).getProfilePic()));
mImageLoader.displayImage(list.get(position).getProfilePic(), avatar, new    AvatarsImageLoadingListener(avatarProgress, avatarBorder, R.drawable.bg_nophoto));
holder.contactName.setText(list.get(position).getContactName());
holder.contactNo.setText(list.get(position).getContactNo());
holder.checkbox.setChecked(list.get(position).isSelected());
return view;
   }

 public ArrayList<ImportContactModel> getCheckList(){
  ArrayList<ImportContactModel> tempList = new ArrayList<ImportContactModel>();
  for(int i=0;i<list.size();i++){
      if(list.get(i).isSelected()){
          tempList.add(list.get(i));
          LogUtils.d(""+list.get(i).getContactName());
      }
  }

  return tempList;
 }


} 
公共类ImportContactArrayAdapter扩展ArrayAdapter{
私人最终名单;
私人最终活动背景;
私有图像加载器;
public ImportContactArrayAdapter(活动上下文,列表){
超级(上下文,R.layout.item\u task\u contact\u select,list);
this.context=上下文;
this.list=列表;
this.mImageLoader=ImageLoader.getInstance();
}
静态类视窗夹{
受保护的ImageView profilePic;
受保护的文本视图联系人名称;
受保护的文本视图联系人编号;
受保护复选框;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=空;
if(convertView==null){
LayoutInflater充气器=上下文。getLayoutInflater();
视图=充气机。充气(R.layout.item\u task\u contact\u select,空);
最终ViewHolder ViewHolder=新的ViewHolder();
//viewHolder.profilePic=(ImageView)view.findViewById(R.id.img\u import\u profilePic);
viewHolder.contactName=(TextView)view.findViewById(R.id.name\u text);
viewHolder.contactNo=(TextView)view.findViewById(R.id.tag\u text\u 1);
viewHolder.contactNo.setVisibility(View.VISIBLE);
viewHolder.contactNo.setTextSize(11);
viewHolder.checkbox=(复选框)view.findViewById(R.id.select\u复选框);
viewHolder.checkbox.setClickable(true);
viewHolder.checkbox
.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,
布尔值(已检查){
ImportContactModel元素=(ImportContactModel)viewHolder.checkbox
.getTag();
element.setSelected(buttonView.isChecked());
}
});
view.setTag(viewHolder);
viewHolder.checkbox.setTag(list.get(position));
}否则{
视图=转换视图;
((ViewHolder)view.getTag()).checkbox.setTag(list.get(position));
}
ViewHolder=(ViewHolder)view.getTag();
ImageView化身=(ImageView)view.findViewById(R.id.img_化身);
ImageView头像顺序=(ImageView)view.findViewById(R.id.img\u头像覆盖);
ProgressBar avatarProgress=(ProgressBar)view.findViewById(R.id.img\u avatar\u progress);
如果(!list.get(position).equals(“”)
//holder.profilePic.setImageURI(Uri.parse(list.get(position.getProfilePic());
mImageLoader.displayImage(list.get(position).getProfilePic(),头像,新头像图像加载侦听器(头像进度,头像顺序,R.drawable.bg_nophoto));
holder.contactName.setText(list.get(position.getContactName());
holder.contactNo.setText(list.get(position.getContactNo());
holder.checkbox.setChecked(list.get(position.isSelected());
返回视图;
}
公共阵列列表getCheckList(){
ArrayList tempList=新的ArrayList();

对于(int i=0;i您不必获取所有联系人来显示它们。AsyncTask有
publishProgress
方法。我对
Cursor
类没有经验,因为我更喜欢ORM,所以我将使用伪代码编写,您必须自己调整它

//in AsyncTask
protected Void doInBackground(params){
    while(cursor.moveToNext()){
        contactInfo = createContact(currentCursorValue);
        publishProgress(contactInfo);
    }
}
onProgressUpdate(contactInfo){
    if(adapter==null){
        //first time adapter setup
    }
    adapter.add(contactInfo);
    adapter.notifyDataSetChanged();
}

这样,每次从Db中提取记录时,您都会发布它,并且项目会不断添加。用户不会注意到任何延迟,除非他尝试搜索尚未存在的项目,或者您希望实现快速滚动的大弹出字母。但是,上述代码不是很有效,因为每.001秒左右发布一次进度是n非常聪明,所以你可以每20个结果发布一次,或者每秒钟发布一次,由你决定。

到目前为止你尝试了什么?如果你的代码工作正常,但速度很慢,我可以建议CodeReview吗?你如何在屏幕上呈现8000个联系人?我已经在后台线程中,但加载了大量联系人的屏幕time@eldjon-客户端电话具有8000 contacts在手机上运行,当我的应用程序读取到contact时,会花费很多时间来呈现contacts的自定义列表视图。从技术上讲,android只会呈现屏幕上可见的联系人,比如10个左右。所以呈现不应该是灾难性的。你能发布自定义列表及其适配器(如果有的话)吗?
//in AsyncTask
protected Void doInBackground(params){
    while(cursor.moveToNext()){
        contactInfo = createContact(currentCursorValue);
        publishProgress(contactInfo);
    }
}
onProgressUpdate(contactInfo){
    if(adapter==null){
        //first time adapter setup
    }
    adapter.add(contactInfo);
    adapter.notifyDataSetChanged();
}