Android:停止在listview中重复图像,性能问题

时间:2012-12-18 15:03:52

标签: android android-adapter

我有一个arrayaadapter,我正在检索带有图像的手机通讯录号码 并将其显示在列表中。

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

    View view = convertView; 

    if (view == null) { 
    LayoutInflater inflater = (LayoutInflater) (getContext() 
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE)); 
    view = inflater.inflate(renderer, null); 
    } 


    TextView text = (TextView) view.findViewById(R.id.name); 
    TextView textContNo = (TextView) view.findViewById(R.id.contactno); 
    TextView textEmailId = (TextView) view.findViewById(R.id.emailId); 
    Profile contact = listCont.get(position); 
    text.setText(contact.getName());    

    QuickContactBadge photo = (QuickContactBadge ) view.findViewById(R.id.quickContactBadge1);  
    photo.setTag(contact.getMobileNo()); 
    new LoadImage(photo).execute(contact.getMobileNo()); 

使用asyncTask

加载backgroundthread中的图像
 class LoadImage extends AsyncTask<String, Void, Bitmap>{ 

        private QuickContactBadge qcb; 

        public LoadImage(QuickContactBadge qcb) { 
        this.qcb= qcb; 
        } 
        @Override 
        protected Bitmap doInBackground( final String... params) { 
        activity.runOnUiThread(new Runnable() { 
        public void run() { 
        new QuickContactHelper(activity, qcb, (String) params[0]).addThumbnail(); 
        } 
        }); 
        return null; 
        } 
        @Override 
        protected void onPostExecute(Bitmap result) { 

        } 
        }

我遇到两个问题,图像重复,滚动不顺畅 我试图在getview方法中实现viewholder但不知道如何使用它或是否有任何其他方法来阻止图像重复。任何帮助表示赞赏

2 个答案:

答案 0 :(得分:0)

我认为库android-query是为你而制作的 在文档中帮助您:http://code.google.com/p/android-query/wiki/ImageLoading

答案 1 :(得分:0)

为了有效地加载图像,Universal Image Loader是一个很好的库,可以有效地在后台加载图像(延迟加载)。

有时会发生什么,当你第一次给任何视图充气时,滚动视图,列表有一些重复旧视图的限制。要做的最佳解决方案是必须使用ViewHolder来保存所有视图,例如

class ViewHolder
{
     View rowView;
     TextView textview = null;

     public ViewHolder(View view)
     {
          rowView = view;
     }

     public TextView getTextView()
     {
          if(textview ==null)
                textview = rowView.findViewById(R.id.text1);
          return textview;
     }
}  

你可以在你的适配器中使用它,如

if(convertview ==null)
{
    convertview = inflater.inflate(renderer, null);
    ViewHolder holder = new ViewHolder(convertview);
    convertview.setTag(holder);
} 

ViewHolder tempHolder = (ViewHolder) convertview.getTag();

TextView textView = tempHolder.getTextView();

如果您执行此操作,则textview和其他观点的引用将保留在ViewHolder中。