【问题标题】:Android-load images from url into listViiew occurs every time scrolling the view每次滚动视图时都会发生从 url 到 listView 的 Android 加载图像
【发布时间】:2016-05-08 14:03:35
【问题描述】:

我有一个列表视图,每一行都是关于从 url 加载的文本和图像。

在第一次加载视图时,前 3 行被渲染并填充了文本,需要几秒钟才能在另一个线程中加载图像。

当我向下滚动时,新行也出现没有图像并加载它,但是当我向上滚动时,我发现之前上传的图像已经消失,只有文本存在并再次重新加载图像。

我想加载一次图像,当我向上和向下滚动图像时,一旦加载一次就不会重新加载。

这是我的代码:

 public class MainActivity extends AppCompatActivity {
        ListViewCountries listViewCountries =new ListViewCountries();
        @Override
         protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                listViewCountries.FillCountriesList();


  setContentView(R.layout.activity_main);
            CountryAdapter adapter=new CountryAdapter();
            ListView lst=(ListView)findViewById(R.id.listView);
            lst.setAdapter(adapter);
        }
        class  CountryAdapter extends BaseAdapter {

            @Override
            public int getCount() {
                return listViewCountries.Count;
            }

            @Override
            public Object getItem(int position) {
                return listViewCountries.Countries.get(position);
            }

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

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                    List<Country> items = listViewCountries.Countries;
                    LayoutInflater inflater = getLayoutInflater();
                    View rowView = inflater.inflate(R.layout.row_cell, null);
                    ImageView img = (ImageView) rowView.findViewById(R.id.flagImg);
                    new DownloadImageTask(img).execute(items.get(position).FlagURL);
                    TextView name = (TextView) rowView.findViewById(R.id.countryName);
                    TextView description = (TextView) rowView.findViewById(R.id.shortText);
                    name.setText(items.get(position).Name);
                    description.setText(items.get(position).ShortDescription);
                    return rowView;


            }
        }
        private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
            ImageView bmImage;

            public DownloadImageTask(ImageView bmImage) {
                this.bmImage = bmImage;
            }

            protected Bitmap doInBackground(String... urls) {

                String urldisplay = urls[0];
                Bitmap mIcon11 = null;
                try {
                    InputStream in = new java.net.URL(urldisplay).openStream();
                    mIcon11 = BitmapFactory.decodeStream(in);
                } catch (Exception e) {
                    Log.e("Error", e.getMessage());
                    e.printStackTrace();
                }
                return mIcon11;
            }

            protected void onPostExecute(Bitmap result) {
                this.bmImage.setImageBitmap(result);
            }
        }

【问题讨论】:

标签: android listview


【解决方案1】:

这从您的代码中非常明显。在你正在调用的 getView 中

            new DownloadImageTask(img).execute(items.get(position).FlagURL);

当您滚动时,每个项目都会调用 getView 并因此再次加载图像,因为在 getView 中您从 url 获取图像,因此没有缓存机制。您需要做的是缓存图像的副本,这样它就不会一次又一次地下载图像,而只是显示缓存中存在的文件。您可以尝试手动构建缓存,例如this

或者更好的是你可以使用picasso。它非常易于使用,只需按照文档进行操作即可。

【讨论】:

  • 谢谢@varunkr 我试过缓存,现在完全可以用了
  • @AsmaaRashad 你是用什么方法做的?,如果答案有帮助,你可以考虑投票/接受它!!
  • 我已经投了赞成票,但我只有 12 个声望,现在我接受了。我通过缓存加载的图像来使用解决方案一并在重新加载行时使用它
  • @AsmaaRashad Thnx 接受,您也可以投票。有助于提高声誉和分数 :) 我看到你有 19 个代表
猜你喜欢
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多