Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 显示图像时显示网格视图_Android_Gridview - Fatal编程技术网

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()


使用AsyncTask加载图像