请问.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回答
嗯,是的当图片太大太长时,用setImageBitmap()时部分机型无效,无法显示。可能你还需要适当缩小图片来解决。祝:学习愉快
underwater
提问者
2019-02-17


相似问题