【问题标题】:Show videos thumbnails (Bitmaps) in Universal Image Loader在 Universal Image Loader 中显示视频缩略图(位图)
【发布时间】:2016-07-15 11:45:25
【问题描述】:

在我的 android 应用程序中,我需要显示 sdcard 目录中的视频缩略图。我用这段代码创建缩略图:

Bitmap bm = ThumbnailUtils.createVideoThumbnail(list.get(position).getPath()
    .substring(8, list.get(position).getPath().length()), MediaStore.Images.Thumbnails.MINI_KIND);

创建缩略图需要时间。如果我在异步类中执行此操作,列表的位置会重复并显示错误的缩略图。

我应该如何管理这个?

编辑 1: 异步类:

public class CreateThumbnail extends AsyncTask<Integer, Void, Void> {

            Bitmap bm;

            @Override
            protected Void doInBackground(Integer... params) {
                bm = ThumbnailUtils.createVideoThumbnail(list.get(params[0]).getPath()
                        .substring(8, list.get(params[0]).getPath().length()), MediaStore.Images.Thumbnails.MINI_KIND);
                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                super.onPostExecute(aVoid);
                imageView.setImageBitmap(bm);
            }
        }

编辑 2: getView 方法:

CheckBox checkBox;
        ImageView imageView;
        int pos = 0;
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            ImageEntity imageEntity = (ImageEntity) this.getItem(position);
            pos = position;

            if (convertView == null) {
                convertView = inflater.inflate(R.layout.item_grid_video, null);

                imageView = (ImageView) convertView.findViewById(R.id.image);
                checkBox = (CheckBox) convertView.findViewById(R.id.CheckBox1);
                convertView.setTag(new ViewHolder(imageView, checkBox));
                checkBox.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        CheckBox cb = (CheckBox) v;
                        ImageEntity imageEntity = (ImageEntity) cb.getTag();
                        imageEntity.setChecked(cb.isChecked());
                        if (imageEntity.isChecked()) {
                            txtCount.setText(String.valueOf(++count));
                            checkCounter(count);
                        } else {
                            txtCount.setText(String.valueOf(--count));
                            checkCounter(count);
                        }
                    }
                });
            }

            else {
                ViewHolder viewHolder = (ViewHolder) convertView.getTag();
                checkBox = viewHolder.getCheckBox();
                imageView = viewHolder.getImageView();
            }

            checkBox.setTag(imageEntity);

            checkBox.setChecked(imageEntity.isChecked());
            if (imageEntity.isVisibleCheckBoxes()) {
                checkBox.setVisibility(View.VISIBLE);
            } else {
                checkBox.setVisibility(View.INVISIBLE);
            }


            imageView.setImageBitmap(ThumbnailUtils.createVideoThumbnail(list.get(position).getPath()
                    .substring(8, list.get(position).getPath().length()), MediaStore.Images.Thumbnails.MINI_KIND));
            //new CreateThumbnail().execute(position);
            return convertView;
        }

【问题讨论】:

  • 请向我们展示更多代码。请在列表视图中向我们展示 getView 方法。
  • 编辑了主帖
  • 嗨@Lithium,您是否正在尝试实现类似于以下的目标?如果是这样,那么您可能需要更改一些代码。 google.lk/imgres?imgurl=http://2.bp.blogspot.com/-m_BYkz7SJKU/…
  • 嗨@RuchiraRandana。是的,我正在尝试制作类似的东西。我应该更改哪些代码?

标签: android bitmap thumbnails


【解决方案1】:

这是我建议的方法。

getView 方法中调用CreateThumbnail 方法。您必须将index 传递给AsyncTask

处理完缩略图和内部onPostExecute方法, 获取代表通过的索引的View。您可以使用this 链接了解如何使用indexlistView 获取视图。

现在您可以将图像设置为您获得引用的imageView

但是,请注意仅在列表视图索引可见时才更新。

此外,当用户滚动并且索引项滚动到可见部分之外时,您可能需要取消AsyncTask。否则,您可能会继续执行过多的后台任务。

【讨论】:

  • 感谢您的回答,但我有点困惑!我将索引传递给异步类,但由于异步类的行为类似于线程,因此发送的索引会更改,而前一个进程尚未完成。考虑到索引没有改变,我如何访问 onPostExecute 中的 imageView?最后,当然用户会滚动。如果我取消 asyncTask 调用,那么他什么也看不到。对吗?
  • 嗨锂。列表视图项的索引不会更改。问题是您指的是一个名为 imageview 的类变量。由于 getview 方法被多次调用,因此您不能对列表执行此操作。您应该将列表视图项的索引传递给异步任务。然后,您应该使用我提供链接的方法来获取对正确图像视图的引用。
【解决方案2】:

列表写入完成后,您是否在异步代码中创建列表的副本?

如果不是(并且您的异步任务改为持有对原始列表的引用),那么异步处理可能在(可能是目录内容)列表完全填充之前开始?

如果没有更多代码,有点难以分辨。

【讨论】:

    猜你喜欢
    • 2014-01-22
    • 2013-09-28
    • 2013-12-26
    • 1970-01-01
    • 2016-12-13
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    相关资源
    最近更新 更多