1

我正在显示联系人列表。除了该设备有 1620 个联系人之外,一切都很好,因此列表滚动非常缓慢,甚至有时会挂起。

        I tried using a check in getView method for ConvertView!=null but it alwayz inflate same view many times. thanks in advance..

        My code for getView method:-
        if(ConvertView==null)
                {   view= mInflater.inflate(R.layout.facebookfriend, null);
                        TextView name=(TextView)view.findViewById(R.id.textView1);
                        ImageView image=(ImageView)view.findViewById(R.id.imageView1);
                    name.setText(mlist.get(position).get("name"));

                        String Id=mlist.get(position).get("contactId");
                        Log.e("Id",""+Id);
                        CheckBox chkbox= (CheckBox)view.findViewById(R.id.checkBox1);
                        chkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                            @Override
                            public void onCheckedChanged(
                                    CompoundButton buttonView, boolean isChecked) {
                                isSelected.set(position, isChecked);
                            }
                        });

                                        String photoid=mlist.get(position).get("photoId");
                    Log.e("photoid",""+photoid);
                        if(mlist.get(position).get("photoId")!=null){
                            Log.e("photoid",""+"photoid");
                            image.setImageBitmap(loadContactPhoto(Id, mlist.get(position).get("photoId")));
                    }
                }
            }

有人告诉我让列表视图根据要求动态加载数据,也可以使用 ViewHolder 来提高效率。我已经尝试过使用视图支架,但每次它都会一次又一次地膨胀单个视图。我的列表滚动非常顺利,但真的不知道为什么它一次又一次地膨胀同一个视图。请帮忙 。我的 viewHolder 代码:-

                    if (ConvertView == null) {
                        holder = new ViewHolder();
                        ConvertView= mInflater.inflate(R.layout.facebookfriend, null);
                        holder.name = (TextView)ConvertView.findViewById(R.id.textView1);
                        holder.imageView = (ImageView)ConvertView.findViewById(R.id.imageView1);
                        holder.chkbox= (CheckBox)ConvertView.findViewById(R.id.checkBox1);
                        ConvertView.setTag(holder);
                    } else {
                        holder = (ViewHolder) ConvertView.getTag();
                    }
                    holder.name.setText(mlist.get(position).get("Name").toString());

                    holder. chkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                        @Override
                        public void onCheckedChanged(
                                CompoundButton buttonView, boolean isChecked) {
                            isSelected.set(position, isChecked);
                            Log.e("position"+position,""+isChecked);
                        }
                    });
                    String Id=mlist.get(position).get("Contactid").toString();

                    Log.e("Id","--------------"+Id);
                    if(mlist.get(position).get("Photoid")!=null){
                        Log.e("photoid",""+"photoid");
                        holder.imageView.setImageBitmap(loadContactPhoto(Id, mlist.get(position).get("Photoid")));
                        Log.e("position position",""+position);
                    }
                }

    static class ViewHolder {
        TextView name;
        ImageView imageView;
        CheckBox chkbox;
    }

我的 Imagefrom 联系方式的代码,我非常确定这个代码

private Bitmap loadContactPhoto(String id, String photoId) {
        Long _id=Long.parseLong(id);
        Long _photoId=0l;
        if(photoId!=null){
            _photoId=Long.parseLong(photoId);
        }
        ContentResolver cr = Setting.this.getContentResolver();
        Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, _id);
        InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
        if (input != null) {
            return BitmapFactory.decodeStream(input);
        } else {
            Log.d("PHOTO", "first try failed to load photo");

        }

        byte[] photoBytes = null;
        Uri photoUri = ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, _photoId);
        Cursor c = cr.query(photoUri,new String[] { ContactsContract.CommonDataKinds.Photo.PHOTO },
                null, null, null);
        try {
            if (c.moveToFirst())
                photoBytes = c.getBlob(0);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            c.close();
        }

        if (photoBytes != null)
            return BitmapFactory.decodeByteArray(photoBytes, 0,
                    photoBytes.length);
        else
            Log.d("PHOTO", "second try also failed");
        Bitmap icon = BitmapFactory.decodeResource(this.getResources(),
                R.drawable.default_image);
        return icon;

}

4

1 回答 1

1

你的问题在loadContactPhoto()我想。每次loadContactPhoto()运行查询并通过解码数组获取位图。这就是滚动变慢的原因。

在加载之前尝试加载所有联系人图像ListView并让我们知道发生了什么。

您还可以按照本教程使用SimpleCursorAdapter.

将联系人照片添加到您的列表应用程序

于 2012-06-06T06:26:40.983 回答