有没有办法在listview上显示项目后立即将drawable加载到Imageview

时间:2015-04-15 10:01:49

标签: android image listview scroll out-of-memory

使用大量本地图片滚动网格视图,使我的应用在设备中崩溃时会有少量内存消息java.lang.OutOfMemoryError或至少在性能良好的设备中滚动非常并且滞后。我为了解决方案而烦恼,并为远程图像找到了一些很好的解决方案,例如:Universal-Image-Loader,它从网上加载图像并兑换它们并管理滚动。但我无法在我的案子中使用它。

这是我的加载图片的适配器:

public class MyAdapter extends ArrayAdapter<StructureCase> {

    private LayoutInflater mInflater           = null;
    public Context         context;
    public Class           distinationActivity = null;



    public MyAdapter(Context context, int textViewResourceId, List<StructureCase> objects) {
        super(context, textViewResourceId, objects);
        mInflater = LayoutInflater.from(context);
       // mInflater = (LayoutInflater)G.currentActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    public static class ViewHolder {


        public ImageView gem_img   = null;
        public TextView  gem_name   = null;      


    }



    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;
        final View v;

        final StructureCase item = getItem(position);

        if (convertView == null) {


            convertView = this.mInflater.inflate(R.layout.my_grid_list,  null);
            //mInflater = (LayoutInflater)G.currentActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.my_grid_list, parent, false);
            viewHolder = new ViewHolder();
            convertView.setTag(viewHolder);


            viewHolder.gem_img = (ImageView) convertView.findViewById(R.id.imageView_mygrid_list);
            viewHolder.gem_name = (TextView) convertView.findViewById(R.id.textView_mygrid_list);           
            viewHolder.gem_name.setTypeface(G.typeFacePrs);



        } else {
           viewHolder = (ViewHolder) convertView.getTag();

        }




        viewHolder.gem_name.setText(item.g_name);


        int id = G.currentActivity.getResources().getIdentifier(item.g_image+"_tmb", "drawable", G.currentActivity.getPackageName());


        if(id != 0){
            Drawable drawable = G.currentActivity.getResources().getDrawable(id);
            viewHolder.gem_img.setImageDrawable(drawable);
        }else{
            viewHolder.gem_img.setImageResource(R.drawable.gem1);

        }


        viewHolder.gem_img.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                Intent i = new Intent(G.currentActivity, GemDetaileActivity.class);
                i.putExtra("id", item.g_ID);
                i.putExtra("content", item.g_text);
                i.putExtra("name", item.g_name);
                i.putExtra("name_en", item.g_name_en);
                i.putExtra("image", item.g_image);
                i.putExtra("image_count", item.g_image_count);
                i.putExtra("hadis", item.g_hadis);
                i.putExtra("good_for", item.g_good_for);
                G.currentActivity.startActivity(i);
                G.currentActivity.overridePendingTransition(R.anim.in_left_2_right, R.anim.out_left_2_right);

            }
        });


        return convertView;
    }

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

我认为我的问题是预加载所有图片,如果有一种方法可以在滚动显示它的项目时将Drawable加载到图像视图,我的问题将解决

1 个答案:

答案 0 :(得分:0)

我终于在毕加索的朋友的帮助下解决了这个问题。它是一个 适用于Android的强大图像下载和缓存库。我知道这一点,但我不知道它也可以用于本地资源。

您必须下载最后一个jar文件并将其添加到项目依赖项中。像这样添加构建gradle:

compile 'com.squareup.picasso:picasso:2.4.2'

然后您可以通过以下方式使用它:

Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2);
Picasso.with(context).load(new File(...)).into(imageView3);

这是Picasso的链接。