0

我有这个从 sd 卡加载图像的 gridview........问题是滚动一点都不流畅,我不知道它有什么问题......有人可以帮我解决这个问题吗??

private Cursor cursor;
private int columnIndex;
private GridView gridView;
ProgressDialog pd;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    gridView = (GridView) findViewById(R.id.gridview);


    new LoadImages().execute();


/**
 * Adapter for our image files.
 */
public class ImageAdapter extends BaseAdapter {

    private Context context;

    public ImageAdapter(Context localContext) {
        context = localContext;
    }

    public int getCount() {
        return cursor.getCount();
    }
    public Object getItem(int position) {
        return position;
    }
    public long getItemId(int position) {
        return position;
    }
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView picturesView;
        if (convertView == null) {
            picturesView = new ImageView(context);
            picturesView.setScaleType(ImageView.ScaleType.FIT_CENTER);
            picturesView.setPadding(5, 5, 5, 5);
            picturesView.setLayoutParams(new GridView.LayoutParams(80, 80));
        }
        else {
            picturesView = (ImageView)convertView;

        }


            // Move cursor to current position
            cursor.moveToPosition(position);
            // Get the current value for the requested column
            int imageID = cursor.getInt(columnIndex);
            // Set the content of the image 
           picturesView.setImageBitmap(MediaStore.Images.Thumbnails.getThumbnail(context.getContentResolver(),
                    imageID, MediaStore.Images.Thumbnails.MINI_KIND, null));

        return picturesView;
    }
}

我不知道这个功能是如何作为后台任务工作的!!!!它只是工作!有什么见解???

private void LoadImagesFromSDCard(){

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));    //to update the database or rescan the database to get the captured image
    //delay given for the sdcard to reload as per the above statement
        try {
            Thread.sleep(300L);   
        }
        catch (Exception e) {}
        // Set up an array of the Thumbnail Image ID column we want
        String[] projection = {MediaStore.Images.Media._ID};
        // Create the cursor pointing to the SDCard
        cursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                projection, // Which columns to return
                null,       // Return all rows
                null,
                MediaStore.Images.Media._ID);
        // Get the column index of the Media Image ID
        columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);

}

这是我的异步任务...

class LoadImages extends AsyncTask<String, String, String> {
    ProgressDialog progDailog = new ProgressDialog(PrintBrushActivity.this);
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progDailog.setMessage("Loading.....");
        progDailog.setIndeterminate(false);
        progDailog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progDailog.show();
    }
    @Override
    protected String doInBackground(String... aurl) {
        //do something while spinning circling show
        LoadImagesFromSDCard();

        return null;
    }
    @Override
    protected void onPostExecute(String unused) {
        super.onPostExecute(unused);
        gridView.setAdapter(new ImageAdapter(PrintBrushActivity.this));
        progDailog.dismiss();
    }
}
}
4

3 回答 3

0

你可以像这样使用 Android-Universal-Image-Loader-master 库

public View getView(int position, View convertView, ViewGroup parent) {
            ImageView picturesView;
            final ProgressBar spinner = (ProgressBar)findViewById(R.id.loading_image_fromsdcard);
            if (convertView == null) {
                picturesView = new ImageView(context);
                picturesView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                picturesView.setLayoutParams(new LayoutParams(250, 250));


            }
            else {
                picturesView = (ImageView)convertView;
            }
            // Move cursor to current position
            cursor.moveToPosition(position);
            // Get the current value for the requested column
            int imageID = cursor.getInt(columnIndex);
            // Set the content of the image based on the provided URI
            //picturesView.setImageURI(Uri.withAppendedPath( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID));
            imageLoader.displayImage(Uri.withAppendedPath( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID).toString(), picturesView, options, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingStarted(String imageUri, View view) {
                    spinner.setVisibility(View.VISIBLE);
                }
                @Override
                public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                    String message = null;
                    switch (failReason.getType()) {
                        case IO_ERROR:
                            message = "Input/Output error";
                            break;
                        case DECODING_ERROR:
                            message = "Image can't be decoded";
                            break;
                        case NETWORK_DENIED:
                            message = "Downloads are denied";
                            break;
                        case OUT_OF_MEMORY:
                            message = "Out Of Memory error";
                            break;
                        case UNKNOWN:
                            message = "Unknown error";
                            break;
                    }
                    Toast.makeText(Sdcard.this, message, Toast.LENGTH_SHORT).show();
                    spinner.setVisibility(View.GONE);
                }
                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                    spinner.setVisibility(View.GONE);
                }
            });
            return picturesView;
        }
    }
于 2014-06-24T03:06:35.917 回答
0

我遇到了同样的问题,我在其他帖子中看到了这个答案,我尝试了一下,效果要好得多。

https://stackoverflow.com/a/7624088/3419242

简而言之,创建一个ListView然后以编程方式自己创建列,这样您就可以创建GridView. 主要问题在于GridviewSDK中的那个,它有点慢

于 2014-03-14T09:49:22.133 回答
0

在我的画廊中,我使用MediaStore.Images.Thumbnails.MICRO_KIND而不是MediaStore.Images.Thumbnails.MINI_KIND

我还使用缓存,也就是说,我保存加载的缩略图的 HashMap,如果我需要再次显示相同的缩略图,我会从缓存中加载它,而不是再次生成它。我的缓存是这样的:

cache = new HashMap<Integer, SoftReference<Bitmap>>();

在 Integer 位置保存图像 id,在 SoftReference 位置保存缩略图位图。这两件事使我的应用程序更流畅。

祝你好运!

于 2012-11-30T11:18:09.850 回答