【问题标题】:is there a way to load drawable to Imageview as soon as item shown on listview有没有办法在listview上显示项目后立即将drawable加载到Imageview
【发布时间】:2015-04-15 10:01:49
【问题描述】:

使用大量本地图像滚动 网格视图 使我的应用程序在具有少量 RAM 的设备中崩溃并显示消息 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 加载到图像视图,我的问题将解决。

【问题讨论】:

  • List&lt;StructureCase&gt; objects。你对objects 什么都不做。 getItem(position);。您省略了 getItem() 的代码。请加。 Drawable drawable = G.currentActivity.getResources().getDrawable(id); viewHolder.gem_img.setImageDrawable(drawable); 将其更改为一条语句 viewHolder.gem_img.setImageResource(id);
  • 进一步:如果您的应用程序崩溃,您将在 logcat 中看到一个错误报告,告诉您原因。请告知并发布 logcat 中的相关部分。
  • 谢谢。但预载没有任何变化。所有图像都在开始时加载并且仍然滚动会使应用程序崩溃。我也使用了 StructureCase item = getItem(position);从我的对象中获取示例图像名称:item.g_image
  • @greenapps 我更新了问题。
  • 请对我所有的 cmets 和建议作出反应。你对他们做了什么?

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


【解决方案1】:

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

您必须下载最后一个 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的链接。

【讨论】:

    猜你喜欢
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多