如何在Android中将图像和视频加载为GridView

时间:2014-09-16 12:01:26

标签: android image video view

我有一个小程序可以处理图像和视频并将它们保存在/ sd / myapp / imagesAndVideos

问题是我想在我的应用程序中制作一个Tab,它显示我的app文件夹中包含所有图像和视频的所有图像和视频

我试图找到一些但没有希望花费6个小时搜索... 我只发现了一对,他们都只做了图像gridView,并没有从文件中加载..

当你一起看到图片和视频或普通的设备图库时,我想让它类似于Instgram gridView ..

1 个答案:

答案 0 :(得分:1)

为什么不使用继承来实现同样的目标,让我向你解释相同的解释。

第一个Girdview或Listview都适用于适配器设计模式,说明这意味着所有AdapterView都挂在数据源上,生成相应的无限列表以供显示。

现在说,你想在List或Gird中显示X类型的内容,为此你可以做的是

  1. 创建一个抽象类名称,例如DataItem。
  2. 现在有一些针对此DataItem的specefic实现,例如ImageItem和VideoItem
  3. 创建项目列表DataItem
  4. 将此列表作为GirdView adpter的来源。
  5. 现在在getView中,您需要执行的是检查DataItem的类型,并返回要显示的相应类型的视图。
  6. 通过上述方法可以生成您需要的一种网格,现在可以进一步改进这种设计。

    你可以在从适配器返回getView之前设置它的视图类型,现在一旦你收到convertView,只需检查标签类型是否与当前项类型匹配,如果那么然后轻松使用相同的convertView else膨胀一个新的相应类型之一,并将其​​设置为标签,依此类推。

    希望这会给你一个想法,

    如果您还需要一些代码,也可以发表评论。

    这是一个假装置。

    // this is your main abstract class
    public abstract class DataItem {
    
        // You can define your data types here
        public static final int DATA_TYPE_IMAGE = 0;
        public static final int DATA_TYPE_VIDEO = 1;
    
        // have all data item implement this
        public abstract int getDataType();
        public abstract String getContentUri();
        public abstract View getChildView(Context context,View convertView);
    
    }
    
    // sample implementation for defining new image type data item
    public class ImageItem extends DataItem {
    
        public String contentUri;
    
        public void setContenturi(String str){
            this.contentUri = str;
        }
    
        @Override
        public int getDataType() {
           // return corresponding content type
            return DataItem.DATA_TYPE_IMAGE;
        }
    
        @Override
        public String getContentUri() {
            // Return URI of image or video, to fetch information related to it
            return this.contentUri;
        }
    
    @Override
    public View getChildView(Context context,View convertView) {
        // return the view you want to display for this data item in grid
    
        // use content uri to fetch and populate Data and then generate view and return
    
        // use convertView is not null
    
        return null;
    }
    
        static class ImageData extends Data{
            // have some variables here which will define attributes of this Data item
    
            // in case of image
    
            String imageName;
            long takenData;
    
        }
    
    }
    
    
    // your sample adapter
    public class GridAdapter extends BaseAdapter {
    
        ArrayList<DataItem> mList;
        Context context;
    
        public GridAdapter(ArrayList<DataItem> items, Context context){
            this.mList = items;
            this.context = context;
        }
    
        public void setList(ArrayList<DataItem> items){
            this.mList = items;
        }
    
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return mList.size();
        }
    
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return mList.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
            DataItem item = mList.get(position);
    
            if(convertView != null){
                // first check if existing view can be used for diaply or nor
                int tag = (Integer)convertView.getTag();
                if(tag == item.getDataType()){
                    // alright both are of same type
                    return item.getChildView(context,convertView);
                }else{
                    // get the new view for corresponding data, set it as tag and return
                    View view = item.getChildView(context,null);
                    view.setTag(new Integer(item.getDataType()));
                    return view;
                }
            }else{
                View view = item.getChildView(context,null);
                view.setTag(new Integer(item.getDataType()));
                return view;
            }
    
        }
    
    }
    

    这就足够了我想抛出一个指针。