Glitches in adapter's getView method

僤鯓⒐⒋嵵緔 提交于 2019-12-23 01:35:12

问题


I am showing the list of contacts .All good except that device has 1620 contacts so list is scrolling very slow and even sometimes get hangs.

        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")));
                    }
                }
            }

somebody told me to make the listview to load the data dynamically as per the requirement,also to use ViewHolder to make it more efficient. I have already tried it using view holder but it every time it inflates the single view again and again.My list is scrolling very smoothly but really do not know why it inflate the same view again and again. Please Help . My code with 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;
    }

My code for Imagefrom contact method,I am damn sure for this code

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:


Your problem is in loadContactPhoto() I think. Each time with loadContactPhoto() you are running query and get the Bitmap by decoding array. That's why the scrolling is getting slow.

Try to load all the contact images before loading the ListView and let us know what happened.

You can also follow this tutorial to load contact with photo using SimpleCursorAdapter.

Add contact photo to your list application



来源:https://stackoverflow.com/questions/10908866/glitches-in-adapters-getview-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!