请问.setImageBitmap()为什么在高API中无法显示

来源:5-2 作业题

underwater

2019-02-17 12:35:39

在自定义Adapter的getView()中为ImageView设置Bitmap在高版本的安卓系统中无效,在4.0.3版本中能正常工作。

.setImageResource()却能完全正常工作。

// 两个图片资源都是在/res/drawable下new的vector asset

// 代码
package com.example.videoiohomework;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;

public class FileExplorerActivity extends AppCompatActivity {

    private ListView fileListLv;

    private File[] fileList;

    private Bitmap folderBitmap;
    private Bitmap fileBitmap;

    private FileExplorerAdapter fileExplorerAdapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_file_explorer);

        fileListLv = findViewById(R.id.file_list_lv);
        folderBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.folder);
        fileBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.file);

        initEvent();
    }

    private void initEvent() {
        fileList = new File(Environment.getExternalStorageDirectory().getAbsolutePath()).listFiles();
        fileExplorerAdapter = new FileExplorerAdapter(this, fileList, folderBitmap, fileBitmap);
        fileListLv.setAdapter(fileExplorerAdapter);
        fileListLv.setOnItemClickListener(new OnFileExplorerItemClickListener());
    }

    private void updateDirectoryFileList(File file) {
        fileList = file.listFiles();
        fileExplorerAdapter.fileList = this.fileList;
        fileExplorerAdapter.notifyDataSetChanged();
    }

    private class FileExplorerAdapter extends BaseAdapter {

        private Context context;
        File[] fileList;
        private Bitmap folderBitmap;
        private Bitmap fileBitmap;

        FileExplorerAdapter(Context context, File[] fileList, Bitmap folderBitmap, Bitmap fileBitmap) {
            this.context = context;
            this.fileList = fileList;
            this.folderBitmap = folderBitmap;
            this.fileBitmap = fileBitmap;
        }

        @Override
        public int getCount() {
            return fileList.length;
        }

        @Override
        public Object getItem(int position) {
            return fileList[position];
        }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder;
            if (convertView == null) {
                convertView = LayoutInflater.from(context).inflate(R.layout.file_item, parent, false);
                viewHolder = new ViewHolder();
                viewHolder.imageView = convertView.findViewById(R.id.file_item_iv);
                viewHolder.textView = convertView.findViewById(R.id.file_item_tv);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            if (fileList[position].isDirectory()) {
                viewHolder.imageView.setImageBitmap(folderBitmap);  // Android 4.0.3模拟器正常显示 | 7.0.0/7.1.0以及真机8.0无任何显示
                viewHolder.imageView.setImageResource(R.drawable.folder);  // 显示正常
            } else {
                viewHolder.imageView.setImageBitmap(fileBitmap);  // 同上
                viewHolder.imageView.setImageResource(R.drawable.file);  // 同上
            }
            viewHolder.textView.setText(fileList[position].getName());
            viewHolder.file = fileList[position];
            return convertView;
        }
    }

    class ViewHolder {
        ImageView imageView;
        TextView textView;
        File file;
    }

    private class OnFileExplorerItemClickListener implements AdapterView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            File file = ((ViewHolder) view.getTag()).file;
            if (file.isDirectory()) {
                updateDirectoryFileList(file);
            } else {
                if (file.getName().contains("mp4")) {
                    // TODO
                } else {
                    Toast.makeText(FileExplorerActivity.this, "不支持该文件的格式", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

}


写回答

2回答

好帮手慕雪

2019-02-18

嗯,是的当图片太大太长时,用setImageBitmap()时部分机型无效,无法显示。可能你还需要适当缩小图片来解决。祝:学习愉快

0

underwater

提问者

2019-02-17

http://img.mukewang.com/climg/5c68e69700018c2905551047.jpghttp://img.mukewang.com/climg/5c68e6c70001b3f006341047.jpg

0

0 学习 · 241 问题

查看课程