【问题标题】:How to load multiple images from sdcard into gridview by using picasso library?如何使用 picasso 库将多个图像从 sdcard 加载到 gridview 中?
【发布时间】:2014-11-14 04:41:17
【问题描述】:

我需要从 sdcard 加载图像,并且必须在 gridview 中显示这些图像。如果有人通过代码知道,请帮助我。

这是我的 mainActivity 类

gv=(GridView)findViewById(R.id.grid);

    pd=new PicasaAdapter(getApplicationContext(), filePathList);

    String[] projection = { MediaStore.Files.FileColumns._ID,
            MediaStore.Files.FileColumns.DATA,
            MediaStore.Files.FileColumns.DATE_ADDED,
            MediaStore.Files.FileColumns.MEDIA_TYPE,
            MediaStore.Files.FileColumns.MIME_TYPE,
            MediaStore.Files.FileColumns.TITLE };

    selection = MediaStore.Files.FileColumns.MEDIA_TYPE + "="
            + MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE ;

    Uri queryUri = MediaStore.Files.getContentUri("external");

    imgcursor = getContentResolver().query(queryUri, projection, selection,
            null, MediaStore.Files.FileColumns.DATE_ADDED + " DESC");

    Log.d(tag, "Image Cursor :" + imgcursor);
    int Totalcount = imgcursor.getCount();
    Log.d(tag, "Total Count :" + Totalcount);

    if (imgcursor != null) {

        Fetcher fet = new Fetcher(MainActivity.this, imgcursor);
        fet.execute(OFFSET);
    }


    gv.setAdapter(pd);


}

这是我的自定义适配器类

public class PicasaAdapter extends BaseAdapter {

private Context mContext;
private ArrayList<String>fileUri = new ArrayList<String>();
private String tag = "Picaso Adapter";
private LayoutInflater mInflater;

public PicasaAdapter(Context mContext, ArrayList<String> filePathList) {
    // TODO Auto-generated constructor stub
    this.mContext = mContext;
    fileUri = filePathList;
    mInflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    Log.d(tag, "Total Path :"+fileUri.size());
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    if (convertView == null) {

        convertView = mInflater.inflate(
                R.layout.image, null);
    }
    ImageView imageView = (ImageView)convertView.findViewById(R.id.imageView);

    Log.d(tag, "Getting Path to Load: "+fileUri.get(position));
    Picasso.with(mContext).load(fileUri.get(position)).into(imageView);

    return convertView;
}

这是 Fetcher 类

public class Fetcher extends AsyncTask<Integer, Integer, Integer> {

ProgressDialog mProgressDialog;
String fMime_type;
Context mContext;
int i, count, j, id, dataColumnIndex;
private Cursor imgcursor;
String TAG = "Fetcher";
@SuppressLint("NewApi")
MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();

public ArrayList<String> arrPathList;
ArrayList<String> mimeType = new ArrayList<String>();

public Fetcher(Context context, Cursor cur) {
    // TODO Auto-generated constructor stub
    mContext = context;
    arrPathList = new ArrayList<String>();
    imgcursor = cur; 

}

@SuppressLint("NewApi")
@Override
protected Integer doInBackground(Integer... params) {
    // TODO Auto-generated method stub

    if (params[0] != null)
        count = params[0];

    if (count == 15)
        j = 0;

    for (int i = j; i < count; i++) {

        imgcursor.moveToPosition(i);
        // Getting Mime-type of the file
        String mime_Type = imgcursor.getString(imgcursor
                .getColumnIndex(MediaStore.MediaColumns.MIME_TYPE));
        Log.d(TAG, "Mime_Type : " + mime_Type);
        if (mime_Type.equals("jpg") || mime_Type.equals("webp")
                || mime_Type.equals("png") || mime_Type.equals("bmp")
                || mime_Type.equals("gif")) {
            fMime_type = "image";
        } else if (mime_Type.equals("mp4") || mime_Type.equals("3gp")
                || mime_Type.equals("mkv")) {
            fMime_type = "video";
        } else
            fMime_type = mime_Type.substring(0, 5);

        if (fMime_type.equals("image")) {

            id = imgcursor.getInt(imgcursor
                    .getColumnIndex(MediaStore.Images.Media._ID));
            dataColumnIndex = imgcursor
                    .getColumnIndex(MediaStore.Images.Media.DATA);
            /*if (bitList != null)
                bitList.add(MediaStore.Images.Thumbnails.getThumbnail(
                        mContext.getContentResolver(), id,
                        MediaStore.Images.Thumbnails.MICRO_KIND, null));
            durationcount.add(null);*/
            mimeType.add(fMime_type);
            arrPathList.add(imgcursor.getString(dataColumnIndex));
            Log.d(TAG, "PathString: "+arrPathList.get(i));

        }
            File f = new File(path);

    j = count;

    return null;
}

@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub
    super.onPreExecute();
    // isLoading = true;

    try {
        mProgressDialog = new ProgressDialog(mContext);
        mProgressDialog.setMessage("Loading...");
        if (mContext != null && !mProgressDialog.isShowing())
            mProgressDialog.show();

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

@Override
protected void onPostExecute(Integer result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);

    if(mProgressDialog != null && mProgressDialog.isShowing()){
        mProgressDialog.dismiss();
        mProgressDialog = null;
    }


    GridView gridView = (GridView)((Activity)mContext).findViewById(R.id.grid);
    // Instance of ImageAdapter Class
    gridView.setAdapter(new PicasaAdapter(mContext, arrPathList));
}

LogCat 错误:

11-14 12:25:19.812: E/AndroidRuntime(805): FATAL EXCEPTION: main
11-14 12:25:19.812: E/AndroidRuntime(805): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.samplepicasa/com.example.samplepicasa.MainActivity}: java.lang.NullPointerException
11-14 12:25:19.812: E/AndroidRuntime(805):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
11-14 12:25:19.812: E/AndroidRuntime(805):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
11-14 12:25:19.812: E/AndroidRuntime(805):  at android.app.ActivityThread.access$600(ActivityThread.java:123)
11-14 12:25:19.812: E/AndroidRuntime(805):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
11-14 12:25:19.812: E/AndroidRuntime(805):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-14 12:25:19.812: E/AndroidRuntime(805):  at android.os.Looper.loop(Looper.java:137)
11-14 12:25:19.812: E/AndroidRuntime(805):  at android.app.ActivityThread.main(ActivityThread.java:4424)
11-14 12:25:19.812: E/AndroidRuntime(805):  at java.lang.reflect.Method.invokeNative(Native Method)
11-14 12:25:19.812: E/AndroidRuntime(805):  at java.lang.reflect.Method.invoke(Method.java:511)
11-14 12:25:19.812: E/AndroidRuntime(805):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-14 12:25:19.812: E/AndroidRuntime(805):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-14 12:25:19.812: E/AndroidRuntime(805):  at dalvik.system.NativeStart.main(Native Method)
11-14 12:25:19.812: E/AndroidRuntime(805): Caused by: java.lang.NullPointerException
11-14 12:25:19.812: E/AndroidRuntime(805):  at com.example.samplepicasa.MainActivity.onCreate(MainActivity.java:50)
11-14 12:25:19.812: E/AndroidRuntime(805):  at android.app.Activity.performCreate(Activity.java:4465)
11-14 12:25:19.812: E/AndroidRuntime(805):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
11-14 12:25:19.812: E/AndroidRuntime(805):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
11-14 12:25:19.812: E/AndroidRuntime(805):  ... 11 more

谢谢。

【问题讨论】:

  • 你做了什么......
  • 你需要使用 adapter 将图像注入特定的网格项。
  • 你可以轻松做到。从 sd 卡中检索图像路径并将其添加到 Arraylist。
  • @Haritha_90 首先你从 sdcard 读取所有图像,然后你创建 coustem 适配器以将其加载到网格视图中
  • @Haritha_90 你有没有为此尝试过?

标签: android gridview picasso


【解决方案1】:

getCount() - 此适配器表示的数据集中有多少项。您正在返回 0 意味着您有该适配器的 0 项目。改成这样

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return fileUri.size();
}

getItem(int) - 获取与数据集中指定位置关联的数据项。改成这样

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return fileUri.get(position);
}

getItemId(int) - 获取与列表中指定位置关联的行 ID。改成这样

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

【讨论】:

  • 谢谢你我已经纠正了,即使我在 picasaAdapter fileUri.size() 的构造函数中遇到空指针异常。
  • 因为您在创建 Adapter's Object 时没有创建 filePathList 的 Object,这就是为什么 filePathList 是 null
  • 我无法理解我必须在哪里创建实际上我已经传递了 filepathlist 对象当我调用适配器 ri8
  • 注释掉 pd=new PicasaAdapter(getApplicationContext(), filePathList); 和 gv.setAdapter(pd); 行。将你的 Fetcher class 移动到 mainActivity class 中。在postExecute为gridview设置适配器
  • 谢谢你,我已经更正了 imagecursor.getcount() 处还有一个空指针异常。
猜你喜欢
  • 2017-05-13
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 2019-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多