【问题标题】:Sort Image according to DATE and TIME inside gridview android根据gridview android中的日期和时间对图像进行排序
【发布时间】:2015-01-27 01:27:18
【问题描述】:

//我的图片保存路径

/storage/emulated/0/Pictures/CameraExample/JPEG_20150107_152640.jpeg

//这是文件路径之一。

//我需要将最后拍摄的照片作为第一个显示的图像//在网格视图中显示图像,最近的照片在//最后。

下面是我的代码

 public class ImageAdapter extends BaseAdapter{


        private Context context;
        private int imageWidth;
        private Activity activity;
        ArrayList<String> itemList = new ArrayList<String>();
        Bitmap bitmap;

        public ImageAdapter(Activity activity,ArrayList<String> itemList,int imageWidth) {
            this.activity = activity;
            this.itemList = itemList;
            this.imageWidth = imageWidth;

        }

        @Override
        public int getCount() {

            return this.itemList.size();
        }

        void add(String path) {
            itemList.add(path);

        }

        @Override
        public Object getItem(int position) {
            return this.itemList.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView imageView;

            if (convertView == null) {

                imageView = new ImageView(activity);


            }
        else {
                imageView = (ImageView) convertView;

            }

            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

            imageView.setLayoutParams(new GridView.LayoutParams(imageWidth ,imageWidth ));


            bitmap = decodeFile(itemList.get(position), imageWidth, imageWidth);

             imageView.setImageBitmap(bitmap);

            imageView.setOnClickListener( new OnImageClickListener(position));


            return imageView;
        }


        class OnImageClickListener implements View.OnClickListener {

            int position;

            public OnImageClickListener(int position){
                this.position = position;
            }

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(activity, ImageDisplayActivity.class);               

                intent.putExtra("position", position);    

                Log.d("ImageAdapter","Intent.putExtra ");
                activity.startActivity(intent);

            }
        }

        public Bitmap decodeFile(String path, int reqWidth, int reqHeight) {
            try {
                File f = new File(path);     
                BitmapFactory.Options o = new BitmapFactory.Options();

                o.inJustDecodeBounds = true;
                BitmapFactory.decodeStream(new FileInputStream(f), null, o);
                final int REQUIRED_WIDTH = reqWidth;
                final int REQUIRED_HEIGHT = reqHeight;
                int scale = 1;
                while (o.outWidth / scale / 2 >= REQUIRED_WIDTH && o.outHeight / scale / 2 >= REQUIRED_HEIGHT)
                    scale *= 2;

                BitmapFactory.Options o2 = new BitmapFactory.Options();
                o2.inSampleSize = scale;
                return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

// 最后当我滚动我的网格视图时。滚动不是那么流畅。请帮我解决两个问题。

// 我的 GridView 活动类

public class GridViewActivity extends Activity {

    private ImageAdapter imageAdapter;
    private HelperUtils utils;
    private ArrayList<String> itemList = new ArrayList<String>();
    private GridView gridView;
    private int columnWidth;
    private Activity activity;


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gridview);

        gridView = (GridView) findViewById(R.id.gridView);

        utils = new HelperUtils(this);

        InitilizeGridLayout();

        itemList = utils.getFilePaths();

        imageAdapter = new ImageAdapter(this, itemList, columnWidth);

        gridView.setAdapter(imageAdapter);

    }

    private void InitilizeGridLayout() {

        Resources r = getResources();
        float padding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, HelperAppConstant.GRID_PADDING, r.getDisplayMetrics());
        columnWidth = (int) ((utils.getScreenWidth() - ((HelperAppConstant.NUM_OF_COLUMNS + 1) * padding)) / HelperAppConstant.NUM_OF_COLUMNS);

        gridView.setNumColumns(HelperAppConstant.NUM_OF_COLUMNS);
        gridView.setColumnWidth(columnWidth);
        gridView.setStretchMode(GridView.NO_STRETCH);
        gridView.setPadding((int) padding, (int) padding, (int) padding, (int) padding);
        gridView.setHorizontalSpacing((int) padding);
        gridView.setVerticalSpacing((int) padding);


    }
}

【问题讨论】:

  • 在使用列表填充网格视图之前为什么不对列表进行排序?
  • 你能给我举个例子吗?
  • 你能把你写的完整的网格视图适配器代码贴出来吗?
  • 在您的活动中实例化ImageAdapter 之前,您是否对itemList 进行了排序?
  • 看看我的活动课。让我知道我必须使用哪种方法进行排序。

标签: android sorting gridview scroll image-gallery


【解决方案1】:

从您的 getView 方法中删除 Collections.sort(itemList);

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;

        if (convertView == null) {
            Log.d("ImageAdapter","Inside the if condition");
            imageView = new ImageView(activity);

        }
    else {
            imageView = (ImageView) convertView;
          }

        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setLayoutParams(new GridView.LayoutParams(imageWidth ,imageWidth ));

       // bitmap = decodeFile(itemList.get(position), imageWidth, imageWidth);

        bitmap = decodeFile(getItem(position), imageWidth, imageWidth);

        imageView.setImageBitmap(bitmap);

        return imageView;
    }

在您在 onCreate 方法中填充网格视图之前对列表进行排序。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gridview);

        gridView = (GridView) findViewById(R.id.gridView);

        utils = new HelperUtils(this);

        InitilizeGridLayout();

        itemList = utils.getFilePaths();

        Collections.sort(itemList);

        imageAdapter = new ImageAdapter(this, itemList, columnWidth);

        gridView.setAdapter(imageAdapter);

    }

您可以按照示例in this link 创建包含图像文件路径和图像位图的项目列表。这样,您不必每次调用getView 时都解码位图。您可以在填充网格视图之前对其进行一次解码。

由于图像是按升序排列的,您可以将getItem 方法替换为以下方法:

    @Override
    public Object getItem(int position) {
        return this.itemList.get(itemList.size() - 1 - position);
    }

我更新了getView 方法。您应该使用getItem(position) 而不是itemList.get(position) 来解码位图。

【讨论】:

  • 如何降序排序?截至目前,新图像保存在网格视图的末尾而不是开头,
  • 改代码后,结果还是一样。我需要一模一样的画廊。每当从相机拍摄新照片时。它出现在开头。还有什么变化吗?
  • 谢谢。它现在工作。对于上面的代码,任何关于使滚动平滑的建议。
  • 很高兴您的问题得到解决。你还在解码getView方法里面的位图吗?
  • @iRuth 我的意思是在多项活动中。啊,没关系,我没有阅读保持教程,现在我明白了:v
【解决方案2】:

为了使您的滚动流畅,您必须使用毕加索库显示图像,我遇到了同样的问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2017-06-02
    • 2020-05-29
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多