GridView滚动不顺畅的android

时间:2012-11-30 10:12:19

标签: android gridview scroll imageview

我有这个加载来自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);

}

这是我的asynctask ......

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

3 个答案:

答案 0 :(得分:0)

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

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

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

其中在整数位置保存图像ID,在SoftReference位置保存缩略图位图。这两件事使我的应用更流畅。

祝你好运!

答案 1 :(得分:0)

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

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

简而言之,创建一个ListView,然后以编程方式自己创建列,这样就可以创建GridView。 主要问题是SDK中的Gridview,它有点慢

答案 2 :(得分: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;
        }
    }