Android 显示图像时显示网格视图
我正在从设备加载图像并将其填充到网格视图中。 我的网格视图滚动是滞后的,即使我使用异步任务来实现这一目的。 谢谢你的帮助Android 显示图像时显示网格视图,android,gridview,Android,Gridview,我正在从设备加载图像并将其填充到网格视图中。 我的网格视图滚动是滞后的,即使我使用异步任务来实现这一目的。 谢谢你的帮助 public class Images extends Fragment { int imageCount = 0; GridView gv; ArrayList<File> list; static ImageAdapter imageAdapter; static File root; static ArrayList<File> a = new
public class Images extends Fragment {
int imageCount = 0;
GridView gv;
ArrayList<File> list;
static ImageAdapter imageAdapter;
static File root;
static ArrayList<File> a = new ArrayList<File>();
public Images() {
// Required empty public constructor
}
ArrayList<File> imageReader(File root) {
ArrayList<File> a = new ArrayList<>();
File[] files = root.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
a.addAll(imageReader(files[i]));
} else {
if (files[i].getName().endsWith(".jpg") || files[i].getName().endsWith(".png")) {
a.add(files[i]);
imageCount = imageCount + 1;
}
}
}
return a;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_images, null);
gv = (GridView) view.findViewById(R.id.gridView);
new MyImagesAsync().execute();
return view;
}
public class MyImagesAsync extends AsyncTask {
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
imageAdapter = new ImageAdapter(getContext(), gv, Images.a);
gv.setAdapter(imageAdapter);
}
@Override
protected Object doInBackground(Object[] params) {
root = new File("/sdcard");
File[] files = new File("/sdcard").listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
Images.a.addAll(imageReader(files[i]));
} else {
if (files[i].getName().endsWith(".jpg") || files[i].getName().endsWith(".png")) {
Images.a.add(files[i]);
}
}
}
return null;
}
}
公共类图像扩展片段{
int imageCount=0;
GridView gv;
数组列表;
静态图像适配器;
静态文件根;
静态ArrayList a=新ArrayList();
公众形象(){
//必需的空公共构造函数
}
ArrayList imageReader(文件根目录){
ArrayList a=新的ArrayList();
File[]files=root.listFiles();
对于(int i=0;i
}
这是我的适配器
public class ImageAdapter extends BaseAdapter {
Context c;
LayoutInflater inflater;
GridView gv;
ArrayList<File> list;
ImageAdapter(Context c, GridView gv, ArrayList<File> list) {
this.gv = gv;
this.list = list;
this.c = c;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return list.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v;
if (convertView == null) {
inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.single_grid, parent, false);
} else {
v = convertView;
}
String path = list.get(position).getPath();
Bitmap bitmap = BitmapFactory.decodeFile(path);
Bitmap bitmap2 = scaleBitmap(bitmap, 100, 100);
ImageView iv = (ImageView) v.findViewById(R.id.imageView);
iv.setImageBitmap(bitmap2);
return v;
}
public static Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth, float newHeight) {
if (bitmapToScale == null)
return null;
//get the original width and height
int width = bitmapToScale.getWidth();
int height = bitmapToScale.getHeight();
// create a matrix for the manipulation
Matrix matrix = new Matrix();
// resize the bit map
matrix.postScale(newWidth / width, newHeight / height);
// recreate the new Bitmap and set it back
return Bitmap.createBitmap(bitmapToScale, 0, 0, bitmapToScale.getWidth(), bitmapToScale.getHeight(), matrix, true);
}
公共类ImageAdapter扩展了BaseAdapter{
上下文c;
充气机;
GridView gv;
数组列表;
ImageAdapter(上下文c、GridView gv、ArrayList列表){
这是gv=gv;
this.list=列表;
这个.c=c;
}
@凌驾
public int getCount(){
返回list.size();
}
@凌驾
公共对象getItem(int i){
返回列表。获取(i);
}
@凌驾
公共长getItemId(int i){
返回list.size();
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
观点五;
if(convertView==null){
充气器=(LayoutInflater)c.getSystemService(Context.LAYOUT\u充气器\u SERVICE);
v=充气机。充气(R.布局。单网格,父,假);
}否则{
v=转换视图;
}
字符串路径=list.get(position.getPath();
位图位图=BitmapFactory.decodeFile(路径);
位图bitmap2=缩放位图(位图,100100);
ImageView iv=(ImageView)v.findViewById(R.id.ImageView);
iv.设置图像位图(位图2);
返回v;
}
公共静态位图缩放位图(位图位图缩放、浮动新宽度、浮动新高度){
if(bitmapToScale==null)
返回null;
//获取原始宽度和高度
int width=bitmapToScale.getWidth();
int height=bitmapToScale.getHeight();
//为操纵创建一个矩阵
矩阵=新矩阵();
//调整位图的大小
矩阵。后标度(新宽度/宽度、新高度/高度);
//重新创建新位图并将其设置回原位
返回Bitmap.createBitmap(bitmapToScale,0,0,bitmapToScale.getWidth(),bitmapToScale.getHeight(),矩阵,true);
}
}您正在主应用程序线程上加载图像。这将表现不佳。使用其中的一个,设计用于在后台线程上加载图像,然后在图像准备好后填充
ImageView
此外:
- 查询
中的图像要比自己扫描所有可能不存在的MediaStore
目录高效得多/sdcard
- 使用
可能会给您提供一个对活动主题一无所知的c.getSystemService(Context.LAYOUT\u INFLATER\u SERVICE)
,请在LayoutInflater
活动上调用
getLayoutInflater()