java - BitmapFactory 解码流在 ListView 中不起作用

标签 java android

自定义列表.java

public class CustomList extends ArrayAdapter<String> {
    private final Activity context;
    private final ArrayList<String> web;
    private final ArrayList<InputStream> imglist;

    public CustomList(Activity context, ArrayList<String> alist,
            ArrayList<InputStream> bitmapArray) {
        super(context, R.layout.listview_custom, alist);
        this.context = context;
        this.web = alist;
        this.imglist = bitmapArray;
    }

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView = inflater.inflate(R.layout.listview_custom, null);

        TextView txtTitle = (TextView) rowView
                .findViewById(R.id.drawer_item_text);

        ImageView imageView = (ImageView) rowView
                .findViewById(R.id.drawer_item_icon);

        txtTitle.setText(web.get(position));

        if (imglist.get(position) != null) {
            imageView.setImageBitmap(BitmapFactory.decodeStream(imglist
                    .get(position)));
        } else {
            imageView.setImageResource(R.drawable.ic_launcher);
        }
        System.out.println("Image Input sream " + imglist.get(position));

        return rowView;
    }
}

自定义适配器

bitmapArray.add(openPhoto(contact_id_long));

CustomList adapter = new CustomList(MainActivity.this, Alist,
                        bitmapArray); 

                list.setAdapter(adapter);
public InputStream openPhoto(long contactId) {
    Uri contactUri = ContentUris.withAppendedId(Contacts.CONTENT_URI,
            contactId);
    Uri photoUri = Uri.withAppendedPath(contactUri,
            Contacts.Photo.CONTENT_DIRECTORY);
    Cursor cursor = getContentResolver().query(photoUri,
            new String[] { Contacts.Photo.PHOTO }, null, null, null);
    if (cursor == null) {
        return null;
    }
    try {
        if (cursor.moveToFirst()) {
            byte[] data = cursor.getBlob(0);
            if (data != null) {
                return new ByteArrayInputStream(data);
            }
        }
    } finally {
        cursor.close();
    }
    return null;
}

自定义数组适配器,我可以看到文本,但看不到图像,但是当我 checkin 日志时,InputStream 工作正常,如果我在 ListView 之外使用 BitmapFactory.decodeStream 我可以看到图像。提前致谢。

最佳答案

您存储一个InputStream对象列表并从中解码位图。但是输入流一旦使用就会返回null。存储路径而不是输入流。 还有诸如标记然后重置输入流之类的事情(InputStream 类的 mark()reset() 方法)。但我不建议使用它们。我记得有一个关于此方法使用和位图解码的错误。

关于java - BitmapFactory 解码流在 ListView 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28124035/

相关文章:

android - 从 TabHost 中的 Tab Widget 中删除 View 会导致布局保持不变? (安卓)

android - Dagger 2 - 注入(inject)构造函数或提供方法哪个更好?

android - 将基于 TabViewController 的应用程序移植到 Android

java - 从命令行运行JAR文件并指定类路径

java - Map Stream 获取 Key 和 Value 乘积的总和

android - 如何在 Android 中为 Facebook Login SDK 撤销特定(或所有)用户权限

android - 从 RecyclerView Adapter 打开 fragment

java - TextView 数组不起作用?

java - 如何让 vaadin 组件同时选择日期和时间

java - SWT 和 Java 8 lambda(Runnable 和timerExec)