先获取文件列表存入Adapter,listview默认先显示一张小的图片,例如显示下在加载的小图片,并用Thread将当前ListView当前要显示的图片进行加载并缩小处理,处理后用Handler方式通过listView更新显示。

解决方案 »

  1.   

    哈哈,问题解决了,最后是用MediaStore+BaseAdapter搞定的。效率非常高,速度很快。下面是源码:package com.demo;import java.util.ArrayList;import android.app.Activity;
    import android.content.Context;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.provider.MediaStore;
    import android.provider.MediaStore.Images;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.TextView;public class PictureActivity extends Activity{ 
        private ListView picturefiles = null;
        private Cursor cursor;
    private ArrayList<PictureInfo> pictureList = new ArrayList<PictureActivity.PictureInfo>();
        
        private static final String[] STORE_IMAGES = {
         MediaStore.Images.Media.DATA,
            MediaStore.Images.Media.MIME_TYPE,
            MediaStore.Images.Media.DISPLAY_NAME,
            MediaStore.Images.Media._ID
        };
        
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.picture);
            showimage();
            // 单击显示图片
            //picturefiles.setOnItemClickListener(new ShowItemImageOnClickListener());
        }
        
        public void showimage(){
         picturefiles = (ListView)findViewById(R.id.picture_list);
            cursor = this.managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, STORE_IMAGES, null, null, null);
            while(cursor.moveToNext()){
    PictureInfo info = new PictureInfo();

    info.filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
    info.mimeType = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.MIME_TYPE));
    info.title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME));

    //获取当前Picture对应的Id,然后根据该ID获取其Thumb
    int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID));
    /*if(info.bitmap!=null&&!info.bitmap.isRecycled())
             {
             info.bitmap.recycle();
             }*/
    BitmapFactory.Options options=new BitmapFactory.Options();
    options.inDither=false;
    options.inPreferredConfig=Bitmap.Config.RGB_565;
    info.bitmap=MediaStore.Images.Thumbnails.getThumbnail(getContentResolver(), id,  Images.Thumbnails.MICRO_KIND, options); 
    //然后将其加入到pictureList
    pictureList.add(info);
            }
    System.out.println(pictureList.size());
    //然后需要设置ListView的Adapter了,使用我们自定义的Adatper
    PictureAdapter adapter = new PictureAdapter(this);
    picturefiles=(ListView)findViewById(R.id.picture_list);
    picturefiles.setAdapter(adapter);
        }
        
        class PictureInfo{
    String filePath;
    String mimeType;
    Bitmap bitmap;
    String title;
    }

    class ViewHolder{
    ImageView thumbImage;
    TextView titleText;
    }

    /**
     * 定义一个Adapter来显示缩略图和视频title信息
     * @author Administrator
     *
     */
    private class PictureAdapter extends BaseAdapter{

    private Context mContext;
    private LayoutInflater inflater;

    public PictureAdapter(Context context){
    this.mContext = context;
    this.inflater = LayoutInflater.from(context); 
    this.inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
    }
    @Override
    public int getCount() {
    // TODO Auto-generated method stub
    return pictureList.size();
    }
    @Override
    public Object getItem(int p) {
    // TODO Auto-generated method stub
    return pictureList.get(p);
    }
    @Override
    public long getItemId(int p) {
    // TODO Auto-generated method stub
    return p;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder ;
    if(convertView == null){
    holder = new ViewHolder();
    convertView = inflater.inflate(R.layout.line, null);
    holder.thumbImage = (ImageView)convertView.findViewById(R.id.icon);
    holder.titleText = (TextView)convertView.findViewById(R.id.file_name);
    convertView.setTag(holder);
    }else{
    holder = (ViewHolder)convertView.getTag();
    }

    //显示信息
    holder.titleText.setText(pictureList.get(position).title);
    if(pictureList.get(position).bitmap != null){
    holder.thumbImage.setImageBitmap(pictureList.get(position).bitmap);
    }
    return convertView;
    }
    }
    }
      

  2.   

    LZ这个方法是把所有图片存到内存里,请注意oom的问题哦,以及第一次载入过慢的问题