android应用程序中有8000个联系人
应用程序需要读取电话簿联系人并将其显示给用户,手机上有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
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();
}