适配器的getView方法出现故障

时间:2012-06-06 05:58:21

标签: android adapter contact

我正在显示联系人列表。除了该设备有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")));
                    }
                }
            }

有人告诉我使listview按照要求动态加载数据,也使用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;

}

1 个答案:

答案 0 :(得分:1)

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

尝试在加载ListView之前加载所有联系人图片,并告诉我们发生了什么。

您还可以按照本教程使用SimpleCursorAdapter加载与照片的联系。

Add contact photo to your list application