【问题标题】:GridView scrolling is not smooth androidGridView滚动不流畅android
【发布时间】:2012-11-30 10:12:19
【问题描述】:

我有这个从 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();
    }
}
}

【问题讨论】:

    标签: android gridview scroll imageview


    【解决方案1】:

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

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

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

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

    祝你好运!

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 请详细解释一下。谢谢。
      【解决方案3】:

      你可以像这样使用 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;
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-06
        • 2018-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多