Android ListView性能改进建议

Android ListView性能改进建议,android,performance,android-listview,Android,Performance,Android Listview,我使用自定义列表视图来显示图像和文本。下面是我的列表视图项的布局文件和隐藏代码。我会在帖子的底部解释我的问题 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height=

我使用自定义列表视图来显示图像和文本。下面是我的列表视图项的布局文件和隐藏代码。我会在帖子的底部解释我的问题

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingTop="5dp"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/imgTitleImage"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:scaleType="fitXY" />

    <TextView
        android:id="@+id/tvNewsTitle"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/imgTitleImage"
        android:layout_alignStart="@+id/imgTitleImage"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:paddingLeft="10dp"
        android:paddingStart="10dp"
        android:paddingRight="10dp"
        android:paddingEnd="10dp"
        android:paddingTop="2dp"
        android:paddingBottom="2dp"
        android:gravity="top|start"
        android:textColor="#FFFFFF"         
        android:background="#80000000" />
</RelativeLayout>
这些代码工作完美,图像和文本加载良好。但是,当项目数量增加时,加载时间也会增加。等待加载视图时,屏幕将为空白。下面是日志

12-21 03:54:20.827:D/OpenGLRenderer(1248):启用调试模式0

12-21 03:54:20.955:I/编舞(1248):跳过36帧!这个 应用程序可能在其主线程上做了太多工作

12-21 03:54:24.991:D/dalvikvm(1248):全部释放467K的总成本,14% 免费4447K/5116K,暂停8ms,总计17ms

12-21 03:54:35.587:D/dalvikvm(1248):全部释放263K的GC,16% 免费4416K/5220K,暂停7ms,总计9ms

12-21 03:54:35.591:I/dalvikvm堆(1248):将堆(frag案例)增长到 4.647MB用于148492字节分配


12-21 03:54:35.607:D/dalvikvm(1248):GC_FOR_ALLOC freed似乎在主线程上运行Global.GetBitmapFromURL。任何网络请求都应该在单独的线程上完成,因此您应该将其移动到AsyncTask或Loader中,以解决您的问题。

您没有使用该结构。这是Android开发团队编写的
EfficientAdapter
类的副本

在对
convertView
进行评估期间,您应该为
持有者分配值

通过在每次调用的条件后指定值

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

Point size;

float ratio = -1;

//calculate the screen size and image ratio
void float getRatio()
{
    if(ratio == -1)
    {
        size = new Point();

        display.getSize(size);

        int width = size.x;

        ratio = width / 320f;
    }

    return ratio;
}

Bitmap titleImage;

Drawable news_title_default = context.getResources().getDrawable(R.drawable.news_title_default);

public View getView(final int position, View convertView, ViewGroup parent) 
{
    ViewHolder holder = null;

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.news_item, null);
        holder = new ViewHolder();

        // assign the holder values
        holder.imageView = (ImageView)convertView.findViewById(R.id.imgTitleImage);
        holder.textView = (TextView)convertView.findViewById(R.id.tvNewsTitle);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder)convertView.getTag();
    }

    convertView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Touch on view handle                              
            ObjNews objNews = objNewss[position];

            Intent intent = new Intent(activity, NewsViewActivity.class);       

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            intent.putExtra("newsId", String.valueOf(objNews.newsId));
            intent.putExtra("type", String.valueOf(Config.NEWS_BRANCH));

            context.startActivity(intent);
        }

    });

    holder.imageView.getLayoutParams().height = (int)(75f * getRatio());
    holder.imageView.getLayoutParams().width = (int)(320f * getRatio());

    titleImage = Global.GetBitmapFromURL("http://www.domain.com/" + objNewss[position].titleImage);

    if(titleImage != null)
    {
        holder.imageView.setImageBitmap(titleImage);
    }   
    else
    {
        holder.imageView.setImageDrawable(news_title_default);    
    }

    //customizing view

    holder.textView.setText(objNewss[position].title);                     

    return convertView;
}
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

Point size;

float ratio = -1;

//calculate the screen size and image ratio
void float getRatio()
{
    if(ratio == -1)
    {
        size = new Point();

        display.getSize(size);

        int width = size.x;

        ratio = width / 320f;
    }

    return ratio;
}

Bitmap titleImage;

Drawable news_title_default = context.getResources().getDrawable(R.drawable.news_title_default);

public View getView(final int position, View convertView, ViewGroup parent) 
{
    ViewHolder holder = null;

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.news_item, null);
        holder = new ViewHolder();

        // assign the holder values
        holder.imageView = (ImageView)convertView.findViewById(R.id.imgTitleImage);
        holder.textView = (TextView)convertView.findViewById(R.id.tvNewsTitle);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder)convertView.getTag();
    }

    convertView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Touch on view handle                              
            ObjNews objNews = objNewss[position];

            Intent intent = new Intent(activity, NewsViewActivity.class);       

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            intent.putExtra("newsId", String.valueOf(objNews.newsId));
            intent.putExtra("type", String.valueOf(Config.NEWS_BRANCH));

            context.startActivity(intent);
        }

    });

    holder.imageView.getLayoutParams().height = (int)(75f * getRatio());
    holder.imageView.getLayoutParams().width = (int)(320f * getRatio());

    titleImage = Global.GetBitmapFromURL("http://www.domain.com/" + objNewss[position].titleImage);

    if(titleImage != null)
    {
        holder.imageView.setImageBitmap(titleImage);
    }   
    else
    {
        holder.imageView.setImageDrawable(news_title_default);    
    }

    //customizing view

    holder.textView.setText(objNewss[position].title);                     

    return convertView;
}