Глюки в методе getView адаптера

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

кто-то сказал мне сделать 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;

}

  • 0
    loadContactPhoto() свой loadContactPhoto() .
  • 0
    частное растровое изображение loadContactPhoto (идентификатор строки, идентификатор строки String) {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 ("ФОТО", "первая попытка не смогла загрузить фотографию"); }
Показать ещё 4 комментария
Теги:
contact
adapter

1 ответ

1

Ваша проблема в loadContactPhoto() Я думаю. Каждый раз с loadContactPhoto() вы запускаете запрос и получаете битмап путем декодирования массива. Вот почему прокрутка замедляется.

Попробуйте загрузить все контактные изображения перед загрузкой ListView и сообщить нам, что произошло.

Вы также можете следовать этому руководству, чтобы загрузить контакт с фотографией с помощью SimpleCursorAdapter.

Добавить контактную фотографию в свой список приложений

  • 0
    Нет, когда мы прокручиваем вызовы метода getView каждый раз и раздуваем представление для этого, я использовал ViewHolder. нет ничего общего с этим методом loadcontactimage ..
  • 0
    Сначала попробуй так. Как вы уверены, что loadContactImage работает нормально?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню