代码之家  ›  专栏  ›  技术社区  ›  Patroy

如何在GridView小部件中设置固定数量的项目?

  •  1
  • Patroy  · 技术社区  · 7 年前

    我有一个GridView小部件,它由来自ArrayList的40个图像填充,问题是当小部件试图加载超过40个位置时,它会生成数百个空白单元格,并“加载”文本。如果项目数固定为40,则不会发生这种情况,但如何做到这一点?

    enter image description here

    这是我的RemoteViewsFactory类:

    public class WidgetRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory {
        private Context ctx;
        private Cursor cursor;
        private ArrayList<Bitmap> photos = new ArrayList<>(40);
    
        public WidgetRemoteViewsFactory(Context applicationContext, Intent intent) {
            ctx = applicationContext;
        }
    
        @Override
        public void onCreate() {
    
        }
    
        @Override
        public void onDataSetChanged() {
    
            String[] projection = new String[]{
                    MediaStore.Images.ImageColumns._ID,
                    MediaStore.Images.ImageColumns.DATA,
                    MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME,
                    MediaStore.Images.ImageColumns.DATE_TAKEN,
                    MediaStore.Images.ImageColumns.MIME_TYPE
            };
            cursor = ctx.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null,
                    null, MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC");
    
            cursor.moveToFirst();
            for (int i = 1; i <= 39; i++) {
                Bitmap bmp = BitmapFactory.decodeFile(cursor.getString(1));
                photos.add(bmp);
                cursor.moveToNext();
                Log.d(TAG, "loop iteration" + i );
            }
        }
    
    
        @Override
        public void onDestroy() {
            if (cursor != null) {
                cursor.close();
            }
        }
    
        @Override
        public int getCount() {
            return cursor == null ? 0 : cursor.getCount();
        }
    
        @Override
        public RemoteViews getViewAt(int position) {
            if (position == AdapterView.INVALID_POSITION ||
                    cursor == null || !cursor.moveToPosition(position) || photos == null || photos.size() == 0 || position >= photos.size()) {
                return null;
            }
                RemoteViews views = new RemoteViews(ctx.getPackageName(), R.layout.widget_item);
                Bitmap img = resizeBitmapFitXY(250, 150, photos.get(position));
                views.setImageViewBitmap(R.id.imageView, img);
                return views;
        }
    
        @Override
        public RemoteViews getLoadingView() {
            return null;
        }
    
        @Override
        public int getViewTypeCount() {
            return 1;
        }
    
        @Override
        public long getItemId(int position) {
            return cursor.moveToPosition(position) ? cursor.getLong(0) : position;
        }
    
        @Override
        public boolean hasStableIds() {
            return true;
        }
    
    
    
    
    
        public Bitmap resizeBitmapFitXY(int width, int height, Bitmap bitmap){
            Bitmap background = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            float originalWidth = bitmap.getWidth(), originalHeight = bitmap.getHeight();
            Canvas canvas = new Canvas(background);
            float scale, xTranslation = 0.0f, yTranslation = 0.0f;
            if (originalWidth > originalHeight) {
                scale = height/originalHeight;
                xTranslation = (width - originalWidth * scale)/2.0f;
            }
            else {
                scale = width / originalWidth;
                yTranslation = (height - originalHeight * scale)/2.0f;
            }
            Matrix transformation = new Matrix();
            transformation.postTranslate(xTranslation, yTranslation);
            transformation.preScale(scale, scale);
            Paint paint = new Paint();
            paint.setFilterBitmap(true);
            canvas.drawBitmap(bitmap, transformation, paint);
            return background;
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Ali Asadi    7 年前

    您需要替换此代码

            cursor.moveToFirst();
            for (int i = 1; i <= 39; i++) {
                Bitmap bmp = BitmapFactory.decodeFile(cursor.getString(1));
                photos.add(bmp);
                cursor.moveToNext();
                Log.d(TAG, "loop iteration" + i );
            }
    

    换成这个

              if (cursor!=null && cursor.getCount()>0) {
                    while (cursor.moveToNext()) {
                        Bitmap bmp = BitmapFactory.decodeFile(cursor.getString(1));
                        photos.add(bmp);
                        Log.d(TAG, "loop iteration" + i );
                    }
                }
    

    这个 问题 在for循环中使用了固定大小 for (int i = 1; i <= 39; i++)

    以及 解决方案 是要使用的 while() 循环以从光标中获取所有项目并将其添加到列表中


    在评论后更新答案:

    Q: 如果您在循环中决定只加载40而不加载空白文本

    你必须这样做

     @Override
        public int getCount() {
            return 40;
        }