如何在android中的不同视图持有者中显示数据

时间:2017-08-21 03:35:52

标签: android

public class GalleryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private final List<String> mList;
    private final Context mContext;
    private final OnGalleryItemClickListener mOnGalleryItemClickListener;
    int [] heaightSize = new int[]{1390,1390,1200,1390,1456,1456,1390,1390,1377,1390};


    public GalleryAdapter(List<String> verticalList, Context context, OnGalleryItemClickListener galleryItemClickListener) {
        this.mList = verticalList;
        this.mContext = context;
        mOnGalleryItemClickListener = galleryItemClickListener;
    }

    private int DptoPx(int px){
        return (int) (px/ Resources.getSystem().getDisplayMetrics().density);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView;

        switch (viewType) {
            case 1:
                itemView = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.main_video_gallery_layout, parent, false);
                return new MainVideoViewHolder(itemView);
            case 2:
                itemView = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.grid_item_layout, parent, false);
                return new MyViewHolder(itemView);
        }


        return null;
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        int height = DptoPx(heaightSize[position % 9]);
        if (holder instanceof MainVideoViewHolder) {

            try {

                Glide.with(mContext).load((new File(mContext.getExternalFilesDir(null) + "/" + mList.get(position))))
                        .thumbnail(0.1f)
                        .crossFade().override(500,500)
                        .placeholder(R.drawable.placeholder)

                        .diskCacheStrategy(DiskCacheStrategy.RESULT)
                        .listener(new RequestListener<File, GlideDrawable>() {
                            @Override
                            public boolean onException(Exception e, File model, Target<GlideDrawable> target, boolean isFirstResource) {
                                ((MainVideoViewHolder) holder).progressBar.setVisibility(View.GONE);
                                return false;
                            }

                            @Override
                            public boolean onResourceReady(GlideDrawable resource, File model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                                ((MainVideoViewHolder) holder).progressBar.setVisibility(View.GONE);

                                return false;
                            }

                        })
                        .into(((MainVideoViewHolder) holder).image_main_video);


            } catch (RuntimeException ex) {
                // Assume this is a corrupt video file.
            }

            ((MainVideoViewHolder) holder).text_main_video_name.setText(mList.get(position).replace(Constant.FILE_EXTENSION, ""));
            ((MainVideoViewHolder) holder).text_datetime.setText(getFilecreationDate(mList.get(position)));

            ((MainVideoViewHolder) holder).image_main_video.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    String value = mList.get(position);
                    if (mOnGalleryItemClickListener != null) {
                        mOnGalleryItemClickListener.onGalleryItemClicked(value);
                    }
                }
            });
        } else {


            try {

//                ((MyViewHolder) holder).rl_mainlayout.getLayoutParams().height=height;
                Glide.with(mContext).load((new File(mContext.getExternalFilesDir(null) + "/" + mList.get(position))))
                        .thumbnail(0.1f)
                        .crossFade()
                        .override(600, 200)
                        .diskCacheStrategy(DiskCacheStrategy.RESULT)
                        .listener(new RequestListener<File, GlideDrawable>() {
                            @Override
                            public boolean onException(Exception e, File model, Target<GlideDrawable> target, boolean isFirstResource) {
                                ((MyViewHolder) holder).progressBar.setVisibility(View.GONE);
                                return false;
                            }

                            @Override
                            public boolean onResourceReady(GlideDrawable resource, File model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                                ((MyViewHolder) holder).progressBar.setVisibility(View.GONE);

                                return false;
                            }

                        })
                        .into(((MyViewHolder) holder).image_tumbnail);


            } catch (RuntimeException ex) {
                // Assume this is a corrupt video file.
            }

            ((MyViewHolder) holder).text_video_name.setText(mList.get(position).replace(Constant.FILE_EXTENSION, ""));
            ((MyViewHolder) holder).text_date_time.setText(getFilecreationDate(mList.get(position)));

            ((MyViewHolder) holder).image_tumbnail.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    String value = mList.get(position);
                    if (mOnGalleryItemClickListener != null) {
                        mOnGalleryItemClickListener.onGalleryItemClicked(value);
                    }
                }
            });
        }


    }

    @Override
    public int getItemCount() {
        if (mList == null)
            return 0;
        return mList.size();
    }

    @Override
    public int getItemViewType(int position) {
        if (mList != null) {
            if (position == 0) {
                return 1;
            } else {
                return 2;
            }

        }
        return 0;
    }

    private String getFilecreationDate(String fileName) {
        String filePath = mContext.getExternalFilesDir(null) + "/" + fileName;
        File from = new File(filePath);
        if (from.exists()) {
            SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
            return sdf.format(new Date(from.lastModified()));
        }
        return "";

    }

    public static class MainVideoViewHolder extends RecyclerView.ViewHolder {
        public final TextView text_main_video_name;
        public final TextView text_datetime;
        public final ImageView image_main_video;
        public final ProgressBar progressBar;
        public MainVideoViewHolder(View itemView) {
            super(itemView);
            text_main_video_name = (TextView) itemView.findViewById(R.id.text_main);
            text_datetime = (TextView) itemView.findViewById(R.id.text_datetime);
            image_main_video = (ImageView) itemView.findViewById(R.id.image_main_video);
            progressBar=(ProgressBar) itemView.findViewById(R.id.progress);
        }
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public final TextView text_video_name;
        public final CardView card_containter;
        public final TextView text_date_time;
        public final ProgressBar progressBar;
        private final ImageView image_tumbnail;
        private final LinearLayout rl_mainlayout;

        public MyViewHolder(View view) {
            super(view);
            text_video_name = (TextView) view.findViewById(R.id.text_video_name);
            card_containter = (CardView) view.findViewById(R.id.card_container);
            text_date_time = (TextView) view.findViewById(R.id.text_date_time);
            image_tumbnail = (ImageView) view.findViewById(R.id.image_main_video);
            progressBar = (ProgressBar) itemView.findViewById(R.id.progress);
            rl_mainlayout=(LinearLayout) itemView.findViewById(R.id.rl_main_layout);

        }
    }

}

这是我的适配器类代码,我这样称呼  GalleryAdapter galleryAdapter = new GalleryAdapter(verticalList,

GalleryActivity.this, this);
            GridLayoutManager verticalLayoutmanager
                        = new GridLayoutManager(GalleryActivity.this,2);
            verticalLayoutmanager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {


                    return position == 0 ? 2 : 1;
                }
            });
            rv_videolist.setLayoutManager(verticalLayoutmanager);
            rv_videolist.setAdapter(galleryAdapter);

我希望设置0位置项更大,这在下面的屏幕中正确,然后我想要设置位置1中等大小项目和位置2,3更小尺寸然后第4位中等大小和第5和第6小尺寸分别。我当前的屏幕在

之下

enter image description here

预期屏幕:预期位置零应如下所示,一行中有2项:

enter image description here

1 个答案:

答案 0 :(得分:1)

您的代码太长,但下面可能是关键。

 public int getSpanSize(int position) {
     return position == 0 ? 2 : 1;
 }

getSpanSize应返回要占用的单元格大小。 因此,返回2位置0,网格大小2表示全宽,其他网格返回1,网格大小2表示半宽。

如果您希望第一行具有全宽,并且在每行之后有3个尺寸为2:1:1的项目,则网格大小为4

new GridLayoutManager(GalleryActivity.this, 4);

分别拥有SpanSizeLookup。请注意,position不是列位置,而是整个项目中的位置。

 public int getSpanSize(int position) {
     // first item is full width
      position 1, 4, 7... is medium, other will be small
     return position == 0 ? 4 : position % 3 == 1 ? 2 : 1; 
 }

我不确定我是否正确理解了你的逻辑,但希望它会有所帮助