滞后的 GridView

Lagged GridView

我正在显示一个 GridView 两列和一个显示信息的适配器。

如果图像相同,滚动速度非常快,但是当显示相同数量的图像但它们不同时,滚动会滞后很多。

我尝试加载 picaso 和其他库,但无法解决我的问题。

(抱歉我的英语不好)

我的适配器

package com.example.anonymous.mh4;


import android.content.Context;
import android.net.Uri;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;



import com.squareup.picasso.Picasso;

import java.io.File;
import java.lang.reflect.Field;

public class MonsterAdapter extends BaseAdapter {

    private final Context mContext;
    private final Monster[] monsters;

    public MonsterAdapter(Context context, Monster[] monsters) {
        this.mContext = context;
        this.monsters = monsters;
    }

    @Override
    public int getCount() {
        return monsters.length;
    }


    @Override
    public long getItemId(int position) {
        return 0;
    }


    @Override
    public Object getItem(int position) {
        return null;
    }


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


        final Monster m = monsters[position];

        if (convertView == null) {
            final LayoutInflater layoutInflater = LayoutInflater.from(mContext);
            convertView = layoutInflater.inflate(R.layout.listviewitemmonster, null);
        }

        final ImageView imageView = (ImageView)convertView.findViewById(R.id.imglayout);
        final TextView nameTextView = (TextView)convertView.findViewById(R.id.namelayout);


        //getDrawableId(m.getIcon());



        //imageView.setImageResource(R.drawable.a1);


        // Picasso.with(mContext).load(R.drawable.a1).into(imageView);



        nameTextView.setText(m.getName());
        int id = mContext.getResources().getIdentifier(m.getIcon(), "drawable", mContext.getPackageName());
        imageView.setImageResource(id);

        //Glide.with(mContext).load("R.drawable."+m.getIcon()).into(imageView);

        /**Picasso.with(mContext).load(id)
                .error(R.drawable.unknow)
                .into(imageView);
        **/
        return convertView;

    }
}

已编辑

package com.example.anonymous.mh4;


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;


import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.squareup.picasso.Picasso;

import java.io.File;
import java.lang.reflect.Field;

public class MonsterAdapter extends BaseAdapter {





    private final Context mContext;


    private final Monster[] monsters;

    public MonsterAdapter(Context context, Monster[] monsters) {
        this.mContext = context;
        this.monsters = monsters;
    }



    @Override
    public int getCount() {
        return monsters.length;
    }


    @Override
    public long getItemId(int position) {
        return 0;
    }


    @Override
    public Object getItem(int position) {
        return null;
    }


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


        final Monster m = monsters[position];

        if (convertView == null) {
            final LayoutInflater layoutInflater = LayoutInflater.from(mContext);
            convertView = layoutInflater.inflate(R.layout.listviewitemmonster, null);
        }

        final ImageView imageView = (ImageView)convertView.findViewById(R.id.imglayout);
        final TextView nameTextView = (TextView)convertView.findViewById(R.id.namelayout);


        //getDrawableId(m.getIcon());

        int id = mContext.getResources().getIdentifier(m.getIcon(), "drawable", mContext.getPackageName());
        Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(), id);

        //imageView.setImageResource(R.drawable.a1);


        // Picasso.with(mContext).load(R.drawable.a1).into(imageView);

        //Picasso.with(mContext).load("file:///android_asset/DvpvklR.png").into(imageView2);

        nameTextView.setText(m.getName());
        imageView.setImageBitmap(bm);

        //imageView.setImageResource(id);

        //Glide.with(mContext).load("R.drawable."+m.getIcon()).into(imageView);

        /**Picasso.with(mContext).load(id)
                .error(R.drawable.unknow)
                .into(imageView);
        **/
        return convertView;

    }
}

它可以工作,但也很滞后

您的问题的原因是 setImageResource() 是涉及图像解码的昂贵同步操作。

除了降低图像质量之外,您的另一个选择是在启动列表之前以某种方式缓存图像(这只能在您的列表不是很长并且最好在后台线程中完成)。

简而言之,您查看列表并构建资源数组:

Bitmap bm = BitmapFactory.decodeResource(getResources(), getIcon());
saveToMap(R.drawable.image, bm);

当您需要显示图像时,您可以执行以下操作:

iconView.setImageBitmap(getFromMap(getIcon()));

您可以使用 HashMap 来 save/get 位图或使用一些其他数据结构(如果您的列表是常量,则为数组)。您可能还必须处理 bitmap/recycling 和内存管理才能使此解决方案正常运行。