RecyclerView高仿IOS照片瀑布流式展示图片效果
来源:互联网 发布:淘宝童装模特拍摄价格 编辑:程序博客网 时间:2024/05/16 10:59
简介:
苹果有自己的组件能够很快捷方便的实现这种类似瀑布流但是比瀑布流更为复杂的照片展示效果,当时接到这个需求时我也是一脸懵逼,而且查阅很多资料以及请教一些同行都没有找到更好的idea,以此在与同事共同商讨之下最终确立设计方式,此布局能够自动根据图片大小进行智能寻找更合适的方格展示,以此达到IOS这种展示效果。
布局效果:
最终效果:
核心代码:
public class PhotoMomentDetailAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ private float mSideMargin; private int ITEM_TYPE_HEADER = 0; private int ITEM_TYPE_CONTENT_GRID = 1; private int ITEM_TYPE_FOOTER = 2; private static final int ITEM_TYPE_CONTENT_LIST0 = 3; private static final int ITEM_TYPE_CONTENT_LIST1 = 4; private static final int ITEM_TYPE_CONTENT_LIST2 = 5; private static final int ITEM_TYPE_CONTENT_LIST3 = 6; private static final int ITEM_TYPE_CONTENT_LIST4 = 7; private static final int ITEM_TYPE_CONTENT_LIST5 = 8; private static final int ITEM_TYPE_CONTENT_LIST6 = 9; private static final int ITEM_TYPE_CONTENT_LIST7 = 10; private static final int ITEM_TYPE_CONTENT_LIST8 = 11; private static final int ITEM_TYPE_CONTENT_LIST9 = 12; private static final int ITEM_TYPE_CONTENT_LIST10 = 13; private int mScreenWidth; private RecyclerView mRecyclerView; private ArrayList<View> mHeaderViews = new ArrayList<View>(); private ArrayList<View> mFooterViews = new ArrayList<View>(); private ArrayList<Integer> mItemList =new ArrayList<>(); private MomentDetailBean mData; //瞬间详情数据源 /**未分组图片数据列表,用于预览*/ private ArrayList<ImagesModel> mSourcePhotoList = new ArrayList<ImagesModel>(); /**选择的数据项path列表*/ private HashMap<String, ImagesModel> mSelectedMap = new HashMap<String, ImagesModel>(); /**是否为编辑状态*/ private boolean mIsEdit; private Context mContext; private int mMaxItemCount=25; private Random mRandom; private LayoutInflater mInflater; private int mPosition; private HashMap<Integer,Integer> mLayoutMap; private int mDataCount; private int mDataTotal; private LinkedHashMap<String,ImagesModel> mSourcePhotoMap = new LinkedHashMap<String,ImagesModel>(); private Handler uiHandler; private ImagesDataManager mImagesDataManager; private IUiGroupChangedListener mUiGroupChangedListener; private OnPhotoItemClickListener onItemClickListener; private boolean mIsShowEncryptImage; private String mSecretKey; private boolean mIsDataFromNet; private CXImageLoaderUtil mImageLoaderUtil; private DisplayImageOptions mPectanglePhotoOption; private DisplayImageOptions mPhotoOption; private boolean mClickShowBigImage=true; private ArrayList<ImgSearchGroup> mDistinguishGroup; private String mTitle; private ArrayList<NewPhotoBean> mBeforehandImgList; private ArrayList<NewPhotoBean> mPanoramagramList; public PhotoMomentDetailAdapter(String title,Context context, RecyclerView view,boolean isDataFromNet,IUiGroupChangedListener groupChangedListener, int screen, OnPhotoItemClickListener itemClickListener, Handler handler) { mTitle = title; mContext = context; mRecyclerView = view; mScreenWidth=screen; mRandom = new Random(); mInflater = LayoutInflater.from(mContext); mImagesDataManager = (ImagesDataManager) BusinessCenter.getDataManager(mContext, BusinessCenter.DataArea.SDCARD,ImagesDataManager.class); mImageLoaderUtil = CXImageLoaderUtil.getInstance(mContext); mPectanglePhotoOption = DisplayImageOptionsFactory.rectanglesHrinkDisplayImageOptions(); mPhotoOption = DisplayImageOptionsFactory.shrinkDisplayImageOptions(); mSideMargin = mContext.getResources().getDimension(R.dimen.img_listview_item_iv_space) * 2; mIsDataFromNet = isDataFromNet; mUiGroupChangedListener =groupChangedListener; onItemClickListener =itemClickListener; uiHandler = handler; init(); } public PhotoMomentDetailAdapter(Context context, ArrayList<ImgSearchGroup> distingyuishGroup, OnPhotoItemClickListener itemClickListener, RecyclerView view, int screen) { mContext = context; mRecyclerView = view; mScreenWidth=screen; mDistinguishGroup =distingyuishGroup; onItemClickListener =itemClickListener; mImageLoaderUtil = CXImageLoaderUtil.getInstance(mContext); mPectanglePhotoOption = DisplayImageOptionsFactory.rectanglesHrinkDisplayImageOptions(); mPhotoOption = DisplayImageOptionsFactory.shrinkDisplayImageOptions(); } /** *HashMap<Integer,Integer>, pararms1为layout的编号id,params2为layout子view数量 * mItemList每个数据与HashMap<Integer,Integer>中每个layout映射 */ private void init() { if (mLayoutMap==null){ mLayoutMap=new HashMap<>(); mLayoutMap.put(0,1); //一大 mLayoutMap.put(1,2); //三小 mLayoutMap.put(2,4); //一大二小 mLayoutMap.put(3,3); //二小一大 mLayoutMap.put(4,3); //一大一小 mLayoutMap.put(5,3); //三大 mLayoutMap.put(6,2); //一大三小 mLayoutMap.put(7,3); //二大 mLayoutMap.put(8,2); //两小 mLayoutMap.put(9,1); //一大 mLayoutMap.put(10,1); //一大 } String title = CXPreferencesHelper.readString(mContext, mTitle, null); //控制同一个条目每次进去显示同样效果 if (title==null){ StringBuffer sb=new StringBuffer(); int[] arr={0,9,10}; //大图布局编号 while(mItemList.size()<mLayoutMap.size()-arr.length){ //1~8号布局随机排列 int itemId=mRandom.nextInt(mLayoutMap.size()-arr.length)+1; if (!mItemList.contains(itemId)){ mItemList.add(itemId); } } int j=0; while(mItemList.size()<mLayoutMap.size()&&j<arr.length){ //往排好的随机布局中见缝插针,不能连续插入,必须间隔 int i = mRandom.nextInt(mItemList.size()); if (i==0&&mItemList.get(i)!=0){ mItemList.add(i, arr[j++]); }else if (i==mItemList.size()-1&&mItemList.get(i)!=0){ mItemList.add(i+1, arr[j++]); //往后面加 }else if(mItemList.get(i)!=0&&mItemList.get(i-1)!=0) { mItemList.add(i, arr[j++]); } } for (int i = 0; i < mItemList.size(); i++) { if (i==0){ sb.append(mItemList.get(i)); }else{ sb.append("&"+mItemList.get(i) ); } } CXPreferencesHelper.saveString(mContext,mTitle,sb.toString()); }else{ String[] split = title.split("&"); for (String s : split) { mItemList.add(Integer.parseInt(s)); } } CXLog.d("bbbb",mItemList.toString()); } /** * 控制是否可以刷新数据 */ public AtomicBoolean mCanRefresh = new AtomicBoolean(true); public void setDataList(MomentDetailBean data) { mData=data; mDataTotal=data.getImgList().size(); ArrayList<ImagesModel> imgList = data.getImgList(); if (mSourcePhotoMap!=null&&mSourcePhotoList!=null) { mSourcePhotoMap.clear(); mSourcePhotoList.clear(); for (int i = 0; i < imgList.size(); i++) { ImagesModel imagesModel = imgList.get(i); mSourcePhotoList.add(imagesModel); mSourcePhotoMap.put(imagesModel.getImgPath(), imagesModel); } } if (getLayoutManager() instanceof GridLayoutManager) { if (getColum() == 1) { beforehandLoadImg(mSourcePhotoList); } } notifyChanged(); } /** * 预加载图片,只在实现照片墙时做预加载处理,目的在于筛选全景图 * @param sourcePhotoList */ private void beforehandLoadImg(ArrayList<ImagesModel> sourcePhotoList) { if (mBeforehandImgList==null) { //非全景图片集合 mBeforehandImgList = new ArrayList<>(); } if (mPanoramagramList==null) { //全景图片集合 mPanoramagramList = new ArrayList<>(); } mBeforehandImgList.clear(); mPanoramagramList.clear(); int beforehandLoad=sourcePhotoList.size()>mMaxItemCount?mMaxItemCount:sourcePhotoList.size(); for (int i = 0; i <beforehandLoad ; i++) { Bitmap bitmap = mImageLoaderUtil.displayBitmap("file://"+sourcePhotoList.get(i) .thumbnailPath, mPectanglePhotoOption); //没有缩略图就拿大图 if (bitmap==null){ bitmap = mImageLoaderUtil.displayBitmap("file://"+sourcePhotoList.get(i) .getPath(), mPectanglePhotoOption); } CXLog.d("bbbb","file://"+sourcePhotoList.get(i).thumbnailPath+" file://"+sourcePhotoList.get(i).getPath()); if (bitmap!=null){ float width = bitmap.getWidth(); float height = bitmap.getHeight(); NewPhotoBean bean = new NewPhotoBean(); bean.index=i; bean.model=sourcePhotoList.get(i); bean.bitmap=bitmap; if ((width/height)>=4){ //全景图规则 mPanoramagramList.add(bean); }else{ mBeforehandImgList.add(bean); } } } refreshDataList(); } /** * 将数据与布局一一对应 */ private void refreshDataList() { mNewPhotoBeanList.clear(); mNewPhotoBeanList.addAll(mBeforehandImgList); if (mPanoramagramList!=null){ int j =0; ArrayList<NewPhotoBean> tempList =new ArrayList<>(); tempList.addAll(mPanoramagramList); for (int i = 0; i < mItemList.size(); i++) { int frontDataCount = getFrontDataCount(i+1); if ((mItemList.get(i)==0||mItemList.get(i)==9||mItemList.get(i)==10)&&j<mPanoramagramList.size()){ if (mNewPhotoBeanList.size()>frontDataCount) { mNewPhotoBeanList.add(frontDataCount, mPanoramagramList.get(j)); }else{ mNewPhotoBeanList.add(mNewPhotoBeanList.size(), mPanoramagramList.get(j)); } tempList.remove(mPanoramagramList.get(j++)); } } if (tempList!=null&&tempList.size()>0){ mNewPhotoBeanList.addAll(tempList); } mNewPhotoList.clear(); for (NewPhotoBean newPhotoBean : mNewPhotoBeanList) { mNewPhotoList.add(newPhotoBean.model); } } Log.d("dddd"," refreshDataList"+mNewPhotoBeanList.size()); } private class NewPhotoBean{ private int index; private ImagesModel model; private Bitmap bitmap; } public interface IUiGroupChangedListener { /** * 选择变化通知UI改变 * @param size 选择数据的总大小(容量) * @param isSelectedAll 是否全选 * @param selectedNum 选择数据数量 * @param isSingle 是否为针对单个操作 * @param model 只有在针对单个进行选择的情况下才有model!=null * @param isChecked 只有在针对单个进行选择的情况下,选中true,取消选中false */ void selectChanged(long size, boolean isSelectedAll, long selectedNum, boolean isSingle, ImagesModel model, boolean isChecked,boolean isEdit); /** * 总数据个数变化 * @param count */ void dataCountChanged(int count); } public interface OnPhotoItemClickListener { /** * 单张图片点击位置 * @param clickIndex */ void onItemClick(int clickIndex); } /** * 添加头部View * * @param view */ public void addHeaderView(View view) { mHeaderViews.add(view); } /** * 添加底部View * * @param view */ public void addFooterView(View view) { mFooterViews.clear(); mFooterViews.add(view); } /** * 获取内容数量 */ public int getContentCount() { if (getColum()==2){ return mDistinguishGroup == null ? 0 : mDistinguishGroup.size(); }else { return mData == null ? 0 : mData.getImgList().size(); } } /** * 获取头部View数量 * * @return */ public int getHeaderViewCount() { return mHeaderViews == null ? 0 : mHeaderViews.size(); } /** * 获取底部View数量 * * @return */ public int getFooterViewCount() { return mFooterViews == null ? 0 : mFooterViews.size(); } /** * 移除头部View * * @param view */ public void removeHeaderView(View view) { mHeaderViews.clear(); } /** * 移除头部View */ public void removeFooterView() { mFooterViews.clear(); } /** * 判断是否是头部View */ public boolean isHeaderView(int position) { return getHeaderViewCount() != 0 && position < getHeaderViewCount(); } /** * 判断是否是底部View */ public boolean isFooterView(int position) { return getFooterViewCount() != 0 && position >= getHeaderViewCount() + getContentCount(); } /** * 获取recyrView的layoutManager */ private RecyclerView.LayoutManager getLayoutManager(){ RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager(); return layoutManager; } /** * 获取recyclerView列数 * @return * getColum==1为瞬间详情摘要界面或getColum==3为瞬间详情显示全部页面 * getColum==4时为瞬间人物、事物分类详情页面 */ private int getColum() { return ((GridLayoutManager) getLayoutManager()).getSpanCount(); } /** * 可显示最大数据量 * @return */ public void setMaxItemCount(int count){ mMaxItemCount=count; } /**获取选择的map,最好不要修改该对象本身*/ public HashMap<String, ImagesModel> getSelectedMap() { return mSelectedMap; } /** * 获取选择的列表信息 * @return */ public ArrayList<String> getSelectedList() { ArrayList<String> paths = new ArrayList<String>(); if(!mSelectedMap.isEmpty()){ Iterator<String> keys = mSelectedMap.keySet().iterator(); while (keys.hasNext()){ paths.add(keys.next()); } } return paths; } public void notifySelectChange() { sendUiSelectChanged(false, null, false); notifyDataSetChanged(); } public void notifyChanged(){ notifyDataSetChanged(); } /** * 只有在针对单个进行选中的情况下才有model!=null * @param model */ private void sendUiSelectChanged(boolean isSingle, ImagesModel model, boolean isChecked) { if(mUiGroupChangedListener != null) { mUiGroupChangedListener.selectChanged(0,isAllSelected(), mSelectedMap.size(), isSingle, model, isChecked, mIsEdit); } } /** * 是否选中 * * @param model * 对象 * @return 是否选中 */ public boolean isCheck(ImagesModel model) { return mSelectedMap.containsKey(model.getPath()); } public void setEditModel(boolean isEdit) { if(isEdit != mIsEdit) { setSelectAll(false); mIsEdit = isEdit; } notifyChanged(); } /** * 用于UI全选或取消全选 * @param isAllSelect */ public void setSelectAll(boolean isAllSelect) { if(mData != null) { mSelectedMap.clear(); if (isAllSelect) { for (ImagesModel model : mData.getImgList()) { mSelectedMap.put(model.getImgPath(), model); } } notifyChanged(); } } /** * 需要更新ui的 */ public void clearSelectDataNoUI(){ if(mSelectedMap!=null){ mSelectedMap.clear(); notifyChanged(); } } /** * 获取用于可预览的列表 * @return */ public ArrayList<ImagesModel> getDataList() { if (getLayoutManager() instanceof GridLayoutManager){ if (getColum()==1){ return mNewPhotoList; }else{ return mSourcePhotoList; } } return null; } public ArrayList<ImagesModel> getAllDataList() { return mSourcePhotoList; } /** * 删除选择的数据列表 * @param isDeletePath 是否删除本地文件 */ public void deleteSelectList(List<String> deleteList, boolean isDeletePath) { if (deleteList != null && mSourcePhotoMap != null) { Iterator<String> delIterator = deleteList.iterator(); while (delIterator.hasNext()) { String path = delIterator.next(); delete(path,isDeletePath); } } } /**会对参数进行修改*/ public void updateSelectListNoUI(List<String> selectList) { mSelectedMap.clear(); if(selectList!=null && !selectList.isEmpty()) { int len = selectList.size(); int count =0; if(mSourcePhotoList != null){ for (ImagesModel model : mSourcePhotoList) { Iterator<String> iterator = selectList.iterator(); while (iterator.hasNext()){ String sel = iterator.next(); if(sel.equals(model.getImgPath())){ mSelectedMap.put(sel, model); iterator.remove(); count++; if (count==len){ return; } break; } } } } } } /** * 删除选择的单个数据 * @param isDeletePath 是否删除本地文件 */ public void deleteSelectPath(String deletePath, boolean isDeletePath) { if (deletePath != null && mSourcePhotoMap != null) { final LinkedHashMap<String,ImagesModel> dataMap = new LinkedHashMap<String,ImagesModel>(); dataMap.putAll(mSourcePhotoMap); delete(deletePath,isDeletePath); } } public void removeSelectDataOnUI(HashMap<String, ImagesModel> deletedMap){ if(deletedMap.isEmpty()){ return; } Iterator<Map.Entry<String,ImagesModel>> iterator = deletedMap.entrySet().iterator(); while (iterator.hasNext()){ Map.Entry<String, ImagesModel> groupMap = iterator.next(); String group = groupMap.getKey(); mSourcePhotoMap.remove(group); } } /** * 删除单个数据 * @param path * @param isDeletePath */ public void delete(String path, boolean isDeletePath) { Iterator<Map.Entry<String,ImagesModel>> groupIterator = mSourcePhotoMap.entrySet().iterator(); mSelectedMap.remove(path); while (groupIterator.hasNext()) { Map.Entry<String, ImagesModel> entry = groupIterator.next(); ImagesModel imagesModel = entry.getValue(); if (imagesModel.getPath().equals(path)) { if(isDeletePath){ boolean res = mImagesDataManager.delete(imagesModel);//删除媒体库 if(res) NewImgSearchDbHelper.getInstance().clearCacheForImg(imagesModel.getImgPath()); mSourcePhotoList.remove(imagesModel); mSourcePhotoMap.remove(imagesModel); } } Iterator<NewPhotoBean> PanoramagramIterator = mPanoramagramList.iterator(); while(PanoramagramIterator.hasNext()){ NewPhotoBean newPhotoBean = PanoramagramIterator.next(); if (path.equals(newPhotoBean.model.getPath())){ PanoramagramIterator.remove(); } } Iterator<NewPhotoBean> BeforehandImgIterator = mBeforehandImgList.iterator(); while(BeforehandImgIterator.hasNext()){ NewPhotoBean newPhotoBean = BeforehandImgIterator.next(); if (path.equals(newPhotoBean.model.getPath())){ BeforehandImgIterator.remove(); } } } if (!groupIterator.hasNext()) { groupIterator.remove(); } refreshDataList(); } /** * 全选或取消全选,不包含ui操作 * @param isAllSelect */ public void setSelectAllNoUI(boolean isAllSelect) { if(mSourcePhotoList != null) { mSelectedMap.clear(); if (isAllSelect) { for (ImagesModel model : mData.getImgList()) { mSelectedMap.put(model.getImgPath(), model); } } } } /** * 返回的是实际的数量 * @return */ public int getCount() { if (getColum()==2){ return mDistinguishGroup != null ? mDistinguishGroup.size() : 0; }else if (getColum()==1||getColum()==3){ return mData != null ? mData.getImgList().size() : 0; } return 0; } /** * 获取源数据,map格式 * @return */ public LinkedHashMap<String,ImagesModel> getDataMap(){ return mSourcePhotoMap; } public boolean isAllSelected() { return mSelectedMap.size() == mDataTotal; } /** * 获取实际条目数量 * @return */ @Override public int getItemCount() { if (getLayoutManager() instanceof GridLayoutManager) { if (getColum() == 3) { mDataCount=getContentCount() + getHeaderViewCount(); return mDataCount; } else if (getColum() == 2) { mDataCount=getContentCount(); return mDataCount; } else if (getColum() == 1) { //照片墙 mDataCount = getContentCount() > mMaxItemCount ? mMaxItemCount + getHeaderViewCount() + getFooterViewCount() : getContentCount() + getHeaderViewCount() + getFooterViewCount(); return getContentPositionCount(mDataCount - (getHeaderViewCount() + getFooterViewCount())) + getHeaderViewCount() + getFooterViewCount(); } } return 0; } /** * 修改选择列表,效率极低 * 用于在其它界面修改了选择项需要重新更新适配器 * @param selectList */ public void updateSelectList(List<String> selectList) { mSelectedMap.clear(); if(selectList!=null && !selectList.isEmpty()) { int len = selectList.size(); int count =0; if(mSourcePhotoList != null){ for (ImagesModel model : mSourcePhotoList) { for(String sel : selectList){ if(sel.equals(model.getImgPath())){ mSelectedMap.put(sel, model); count++; if (count==len){ notifySelectChange(); return; } } } } } }else { notifySelectChange(); } } /** * 设置是否显示加密后的图片 * @param isShow */ public void setShowEncryptImage(boolean isShow, String secretKey){ mIsShowEncryptImage = isShow; mSecretKey = secretKey; } /** * 获取数据占用条目数量 * @param contentCount * @return */ private int getContentPositionCount(int contentCount ) { int contentPositionCount=0; int i=0; while(contentCount>i&&contentPositionCount<mItemList.size()){ i+=mLayoutMap.get(mItemList.get(contentPositionCount++)); } return contentPositionCount; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { mPosition=position; if (holder instanceof HeaderViewHolder) { } else if (holder instanceof FooterViewHolder) { } else if (holder instanceof GridViewHolder) { bindGridViewHolder(holder, position); }else if (holder instanceof ListViewHolder){ bindListViewHolder(holder, position); } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == ITEM_TYPE_CONTENT_GRID) { return creatContentViewHolder(); } else if (viewType == ITEM_TYPE_HEADER) { return new HeaderViewHolder(mHeaderViews.get(0)); } else if (viewType == ITEM_TYPE_FOOTER) { return new FooterViewHolder(mFooterViews.get(0)); }else if (viewType == ITEM_TYPE_CONTENT_LIST0) { return creatContentViewHolder(); }else if (viewType == ITEM_TYPE_CONTENT_LIST1) { return creatContentViewHolder(); }else if (viewType == ITEM_TYPE_CONTENT_LIST2) { return creatContentViewHolder(); }else if (viewType == ITEM_TYPE_CONTENT_LIST3) { return creatContentViewHolder(); }else if (viewType == ITEM_TYPE_CONTENT_LIST4) { return creatContentViewHolder(); }else if (viewType == ITEM_TYPE_CONTENT_LIST5) { return creatContentViewHolder(); }else if (viewType == ITEM_TYPE_CONTENT_LIST6) { return creatContentViewHolder(); }else if (viewType == ITEM_TYPE_CONTENT_LIST7) { return creatContentViewHolder(); }else if (viewType == ITEM_TYPE_CONTENT_LIST8) { return creatContentViewHolder(); }else if (viewType == ITEM_TYPE_CONTENT_LIST8) { return creatContentViewHolder(); }else if (viewType == ITEM_TYPE_CONTENT_LIST9) { return creatContentViewHolder(); }else if (viewType == ITEM_TYPE_CONTENT_LIST10) { return creatContentViewHolder(); } return null; } /** * 判断条目类型 */ @Override public int getItemViewType(int position) { if (getLayoutManager() instanceof GridLayoutManager){ if (getHeaderViewCount() != 0 && position < getHeaderViewCount()) { return ITEM_TYPE_HEADER; } else if (getFooterViewCount() != 0 && position >= getItemCount()-getFooterViewCount()){ return ITEM_TYPE_FOOTER; } else { if (getColum()==3||getColum()==2){ return ITEM_TYPE_CONTENT_GRID; }else if (getColum()==1){ if (position==getHeaderViewCount()){ return ITEM_TYPE_CONTENT_LIST0; }else if (position==(getHeaderViewCount()+1)){ return ITEM_TYPE_CONTENT_LIST1; }else if (position==(getHeaderViewCount()+2)){ return ITEM_TYPE_CONTENT_LIST2; }else if (position==(getHeaderViewCount()+3)){ return ITEM_TYPE_CONTENT_LIST3; }else if (position==(getHeaderViewCount()+4)){ return ITEM_TYPE_CONTENT_LIST4; }else if (position==getHeaderViewCount()+5){ return ITEM_TYPE_CONTENT_LIST5; }else if (position==getHeaderViewCount()+6){ return ITEM_TYPE_CONTENT_LIST6; }else if (position==getHeaderViewCount()+7){ return ITEM_TYPE_CONTENT_LIST7; }else if (position==getHeaderViewCount()+8) { return ITEM_TYPE_CONTENT_LIST8; }else if (position==getHeaderViewCount()+9) { return ITEM_TYPE_CONTENT_LIST9; }else if (position==getHeaderViewCount()+10) { return ITEM_TYPE_CONTENT_LIST10; } } } } return -1; } @Override public long getItemId(int position) { return super.getItemId(position); } class HeaderViewHolder extends RecyclerView.ViewHolder { public HeaderViewHolder(View itemView) { super(itemView); } } class FooterViewHolder extends RecyclerView.ViewHolder { public FooterViewHolder(View itemView) { super(itemView); } } private RecyclerView.ViewHolder creatContentViewHolder() { if (getLayoutManager() instanceof GridLayoutManager) { if (getColum() == 3) { View gridView = LayoutInflater.from(mContext).inflate(R.layout.act_moment_detail_content, null); View first=gridView.findViewById(R.id.content); ViewGroup.LayoutParams first_Params = first.getLayoutParams(); first_Params.height=mScreenWidth/3; first.setLayoutParams(first_Params); return new GridViewHolder(gridView); }else if (getColum()==2){ View gridView = LayoutInflater.from(mContext).inflate(R.layout.item_moment_distinguish_sort,null); View first=gridView.findViewById(R.id.item_moment_distinguish_sort_img); ViewGroup.LayoutParams first_Params = first.getLayoutParams(); first_Params.height=mScreenWidth*3/8; first.setLayoutParams(first_Params); return new GridViewHolder(gridView); }else if (getColum() == 1) { int itemView = mItemList.get(mPosition); //实际position=mPosition+getHeaderViewCount itemView为Layout编号 if (itemView == 0 || itemView == 9 || itemView == 10) { View only_one = mInflater.inflate(R.layout.item_only_one_moment, null); return new OnlyOneViewHolder(only_one); } else if (itemView == 1) { View one_big_one_small = mInflater.inflate(R.layout.item_one_big_one_small_moment, null); View one_big_one_small_first = one_big_one_small.findViewById(R.id.first); ViewGroup.LayoutParams one_big_one_small_Params = one_big_one_small_first.getLayoutParams(); one_big_one_small_Params.height = mScreenWidth * 17 / 36; one_big_one_small_first.setLayoutParams(one_big_one_small_Params); return new OneBigOneSmallViewHolder(one_big_one_small); } else if (itemView == 2) { View one_big_three_small = mInflater.inflate(R.layout.item_one_big_three_small_moment, null); View one_big_three_small_first = one_big_three_small.findViewById(R.id.first); ViewGroup.LayoutParams one_big_three_samll_params = one_big_three_small_first.getLayoutParams(); one_big_three_samll_params.height = mScreenWidth * 3 / 4; one_big_three_small_first.setLayoutParams(one_big_three_samll_params); return new OneBigThreeSmallViewHolder(one_big_three_small); } else if (itemView == 3) { View one_big_two_small = mInflater.inflate(R.layout.item_one_big_two_samll_moment, null); View one_big_two_small_first = one_big_two_small.findViewById(R.id.first); ViewGroup.LayoutParams one_big_two_small_Params = one_big_two_small_first.getLayoutParams(); one_big_two_small_Params.height = mScreenWidth * 1 / 2; one_big_two_small_first.setLayoutParams(one_big_two_small_Params); return new OneBigTwoSmallViewHolder(one_big_two_small); } else if (itemView == 4) { View three_big = mInflater.inflate(R.layout.item_three_big_moment, null); View three_big_first = three_big.findViewById(R.id.first); ViewGroup.LayoutParams three_big_params = three_big_first.getLayoutParams(); three_big_params.height = mScreenWidth * 1 / 2; three_big_first.setLayoutParams(three_big_params); return new ThreeBigViewHolder(three_big); } else if (itemView == 5) { View three_small = mInflater.inflate(R.layout.item_three_small_moment, null); View three_small_first = three_small.findViewById(R.id.first); ViewGroup.LayoutParams three_small_params = three_small_first.getLayoutParams(); three_small_params.height = mScreenWidth * 1 / 4; three_small_first.setLayoutParams(three_small_params); return new ThreeSmallViewHolder(three_small); } else if (itemView == 6) { View two_big = mInflater.inflate(R.layout.item_two_big_moment, null); View two_big_first = two_big.findViewById(R.id.first); ViewGroup.LayoutParams two_big_params = two_big_first.getLayoutParams(); two_big_params.height = mScreenWidth * 3 / 4; two_big_first.setLayoutParams(two_big_params); return new TwoBigViewHolder(two_big); } else if (itemView == 7) { View two_small_one_big = mInflater.inflate(R.layout.item_two_samll_one_big_moment, null); View two_small_one_big_third = two_small_one_big.findViewById(R.id.third); ViewGroup.LayoutParams two_small_one_big_params = two_small_one_big_third.getLayoutParams(); two_small_one_big_params.height = mScreenWidth * 1 / 2; two_small_one_big_third.setLayoutParams(two_small_one_big_params); return new TwoSmallOneBigViewHolder(two_small_one_big); } else if (itemView == 8) { View two_small = mInflater.inflate(R.layout.item_two_small_moment, null); View two_small_first = two_small.findViewById(R.id.first); ViewGroup.LayoutParams two_small_params = two_small_first.getLayoutParams(); two_small_params.height = mScreenWidth * 7 / 18; two_small_first.setLayoutParams(two_small_params); return new TwoSmallViewHolder(two_small); } } } return null; } private void bindGridViewHolder(RecyclerView.ViewHolder holder, int position){ if (holder instanceof GridViewHolder) { ((GridViewHolder) holder).refreshView(position); } } private void bindListViewHolder(RecyclerView.ViewHolder holder, int position) { int itemPosition=mItemList.get(position-getHeaderViewCount()); if ((holder instanceof OnlyOneViewHolder)&&(itemPosition==0||itemPosition==9||itemPosition==10)){ ((OnlyOneViewHolder) holder).refreshView(position); }else if ((holder instanceof OneBigOneSmallViewHolder)&&itemPosition==1){ ((OneBigOneSmallViewHolder) holder).refreshView(position); }else if ((holder instanceof OneBigThreeSmallViewHolder)&&itemPosition==2){ ((OneBigThreeSmallViewHolder) holder).refreshView(position); }else if ((holder instanceof OneBigTwoSmallViewHolder)&&itemPosition==3){ ((OneBigTwoSmallViewHolder) holder).refreshView(position); }else if ((holder instanceof ThreeBigViewHolder)&&itemPosition==4){ ((ThreeBigViewHolder) holder).refreshView(position); }else if ((holder instanceof ThreeSmallViewHolder)&&itemPosition==5){ ((ThreeSmallViewHolder) holder).refreshView(position); }else if ((holder instanceof TwoBigViewHolder)&&itemPosition==6){ ((TwoBigViewHolder) holder).refreshView(position); }else if ((holder instanceof TwoSmallOneBigViewHolder)&&itemPosition==7){ ((TwoSmallOneBigViewHolder) holder).refreshView(position); }else if ((holder instanceof TwoSmallViewHolder)&&itemPosition==8){ ((TwoSmallViewHolder) holder).refreshView(position); } } class GridViewHolder extends RecyclerView.ViewHolder { public View view; public GridViewHolder(View itemView) { super(itemView); view=itemView; } public void refreshView(int position){ if (getColum()==3) { View itemView=view.findViewById(R.id.content); refreshPerView(position-getHeaderViewCount(), itemView,position); }else if (getColum()==2){ RoundImageView img = (RoundImageView) view.findViewById(R.id.item_moment_distinguish_sort_img); TextView name = (TextView) view.findViewById(R.id.item_moment_distinguish_name); name.setText(mDistinguishGroup.get(position).getSubTagName()); TextView num = (TextView) view.findViewById(R.id.item_moment_distinguish_num); num.setText(mContext.getResources().getString(R.string.act_moment_detail_footer_distinguish_num,mDistinguishGroup.get(position).items.size())); loadImg(img,null,mDistinguishGroup.get(position).getSubTagCoverThumbPath()); setClickEvent(view, position); } } } private abstract class ListViewHolder extends RecyclerView.ViewHolder { public View view; public ListViewHolder(View itemView) { super(itemView); view=itemView; } public abstract void refreshView(int position); } private class OnlyOneViewHolder extends ListViewHolder { public OnlyOneViewHolder(View itemView) { super(itemView); } @Override public void refreshView(int position) { int[] height ={18,14,22}; int i = 0; int itemPosition=mItemList.get(position-getHeaderViewCount()); //控制条目不可复用,限制条目的高度,此处获取的是布局编号 if (itemPosition==0){ i=0; }else if (itemPosition==9){ i=1; }else if (itemPosition==10){ i=2; } View only_one_first=view.findViewById(R.id.first); if (only_one_first.getTag()==null) { ViewGroup.LayoutParams only_one_Params = only_one_first.getLayoutParams(); only_one_Params.height = mScreenWidth * (height[i]) / 36; only_one_first.setLayoutParams(only_one_Params); only_one_first.setTag(itemPosition); } refreshListPerView(view, position, R.id.first, 0); } } private class OneBigOneSmallViewHolder extends ListViewHolder { public OneBigOneSmallViewHolder(View view) { super(view); } @Override public void refreshView(int position) { refreshListPerView(view, position, R.id.first, 0); refreshListPerView(view, position, R.id.second, 1); } } private class OneBigThreeSmallViewHolder extends ListViewHolder { public OneBigThreeSmallViewHolder(View view) { super(view); } @Override public void refreshView(int position) { refreshListPerView(view, position, R.id.first, 0); refreshListPerView(view, position, R.id.second, 1); refreshListPerView(view, position, R.id.third, 2); refreshListPerView(view, position, R.id.fourth, 3); } } private class OneBigTwoSmallViewHolder extends ListViewHolder { public OneBigTwoSmallViewHolder(View view) { super(view); } @Override public void refreshView(int position) { refreshListPerView(view, position, R.id.first, 0); refreshListPerView(view, position, R.id.second, 1); refreshListPerView(view, position, R.id.third, 2); } } private class ThreeBigViewHolder extends ListViewHolder { View chlidView; public ThreeBigViewHolder(View view) { super(view); } @Override public void refreshView(int position) { refreshListPerView(view, position, R.id.first, 0); refreshListPerView(view, position, R.id.second, 1); refreshListPerView(view, position, R.id.third, 2); } } private class ThreeSmallViewHolder extends ListViewHolder { public ThreeSmallViewHolder(View view) {super(view);} @Override public void refreshView(int position) { refreshListPerView(view, position, R.id.first, 0); refreshListPerView(view, position, R.id.second, 1); refreshListPerView(view, position, R.id.third, 2); } } private class TwoBigViewHolder extends ListViewHolder { public TwoBigViewHolder(View view) {super(view);} @Override public void refreshView(int position) { refreshListPerView(view, position, R.id.first, 0); refreshListPerView(view, position, R.id.second, 1); } } private class TwoSmallOneBigViewHolder extends ListViewHolder { public TwoSmallOneBigViewHolder(View view) {super(view);} @Override public void refreshView(int position) { refreshListPerView(view, position, R.id.first, 0); refreshListPerView(view, position, R.id.second, 1); refreshListPerView(view, position, R.id.third, 2); } } private class TwoSmallViewHolder extends ListViewHolder { public TwoSmallViewHolder(View view) {super(view);} @Override public void refreshView(int position) { refreshListPerView(view, position, R.id.first, 0); refreshListPerView(view, position, R.id.second, 1); } } /** * 获取position-1内格子总量 * @param position * @return */ private int getFrontDataCount(int position) { int frontPosition=0; //position-1内每个layout的index int frontDataCount=0; //position-1内所有子View总量 while (frontPosition<position-1){ frontDataCount+=mLayoutMap.get(mItemList.get(frontPosition++)); } return frontDataCount; } /** * spanCount==1时每个格子填充图片数据 * @param view * @param position * @param id * @param index */ private void refreshListPerView(View view,int position,int id,int index) { int frontDataCount = getFrontDataCount(position); int curIndex = frontDataCount + index; View perView = view.findViewById(id); //单个格子 if (curIndex < mDataCount - getHeaderViewCount() - getFooterViewCount()) { refreshPerView(curIndex, perView,position); } else { perView.setVisibility(View.GONE); } } private ArrayList<ImagesModel> mNewPhotoList = new ArrayList<>(); //数据重排之后的集合 private ArrayList<NewPhotoBean> mNewPhotoBeanList = new ArrayList<>(); //数据重排之后的集合 /** * getColum()==1或 getColum()==3每个格子填充图片数据 * @param curIndex * @param perView */ private void refreshPerView(final int curIndex, View perView,int position) { final CoverImageView picView = (CoverImageView) perView.findViewById(R.id.iv); final CheckBox picCheckBox = (CheckBox) perView.findViewById(R.id.check); ImageView ivUploadTag = (ImageView) perView.findViewById(R.id.iv_upload_tag); ImagesModel model = null; if (getLayoutManager() instanceof GridLayoutManager){ Log.d("dddd",position+" aaa"); if (getColum()==1){ //显示预加载图片 if (curIndex>=mNewPhotoBeanList.size()) {// picView.setImageDrawable(null);// picView.setTag(R.id.iv, null);// picView.setCoverShow(false); perView.setVisibility(View.GONE); return; } NewPhotoBean newPhotoBean = mNewPhotoBeanList.get(curIndex); Bitmap bitmap = newPhotoBean.bitmap; model=newPhotoBean.model; if (model==null||bitmap==null){ perView.setVisibility(View.GONE); return; } int itemPosition=mItemList.get(position-getHeaderViewCount()); //获取当前布局编号 if (itemPosition==0||itemPosition==9||itemPosition==10){ //存在全景图时,大图布局优先加载全景图 if ((bitmap.getWidth()/bitmap.getHeight())>=4){ View only_one_first = perView.findViewById(R.id.first); ViewGroup.LayoutParams only_one_Params = only_one_first.getLayoutParams(); only_one_Params.height = mScreenWidth * 7 / 36; only_one_first.setLayoutParams(only_one_Params); } isShowPicView(perView, picView,bitmap); }else{ isShowPicView(perView, picView,bitmap); } }else{ //加载图片 model = mSourcePhotoList.get(curIndex); loadImg(picView,model, model.thumbnailPath); } } ivUploadTag.setVisibility(View.VISIBLE); //检测是当前照片是否已上传到云端 if(model.isUploaded()) { ivUploadTag.setBackgroundResource(R.drawable.img_uploaded); }else { ivUploadTag.setBackgroundResource(R.drawable.img_not_upload); } if (mIsEdit) { boolean checked = mSelectedMap.containsKey(model.getPath()); picCheckBox.setOnCheckedChangeListener(null);// 清除之前的监听 picCheckBox.setChecked(checked); picView.setCoverShow(checked); if (picCheckBox.getVisibility() != View.VISIBLE) { picCheckBox.setVisibility(View.VISIBLE); } // 选择 picCheckBox.setTag(model); picCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Object tag = buttonView.getTag(); if (tag == null || !(tag instanceof ImagesModel)) { //非法数据 return; } // 修改选择列表 ImagesModel innerModel = (ImagesModel) tag; String path = innerModel.getPath(); if (isChecked) { if (!mSelectedMap.containsKey(path)) { mSelectedMap.put(path, innerModel); // changeGroupSelect(true, path); picView.setCoverShow(true); } } else { mSelectedMap.remove(path); //changeGroupSelect(false,path); picView.setCoverShow(false); } //notifyUI2SelectChanged(); sendUiSelectChanged(true, innerModel, isChecked); } }); if (mClickShowBigImage) { picView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(onItemClickListener != null) { onItemClickListener.onItemClick(curIndex); } } }); } else { picView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { picCheckBox.performClick();// 单击选择 } }); } }else { picView.setCoverShow(false); if (picCheckBox.getVisibility() != View.GONE) { picCheckBox.setVisibility(View.GONE); } picView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(onItemClickListener != null) { onItemClickListener.onItemClick(curIndex); } } }); } } /** * 展示圖片 * @param perView * @param picView */ private void isShowPicView(View perView, CoverImageView picView, Bitmap bitmap) { if (bitmap==null){ picView.setImageDrawable(null); picView.setTag(R.id.iv, null); picView.setCoverShow(false); perView.setVisibility(View.GONE); }else{ picView.setImageBitmap(bitmap); } } /** * 加载图片 * @param picView * @param model * @param path */ private void loadImg(ImageView picView, ImagesModel model, String path) { String pathUtlDes = null; boolean hasHeader = false; if (!CXUtil.isEmpty(path)) { if (path.startsWith("http://")) { pathUtlDes = path; } else { pathUtlDes = (path.startsWith("file://"))?path: "file://" + path; } } else { if (model!=null) { pathUtlDes = (model.getPath().startsWith("file://"))? model.getPath(): "file://" + model.getPath(); } hasHeader = mIsShowEncryptImage? true: false; } String pathUrlOrg = (String) picView.getTag(R.id.iv); if (null == pathUrlOrg || !pathUrlOrg.endsWith(pathUtlDes)) { picView.setImageDrawable(null); //是否需要显示默认的长方形图片,防止单张图片拉伸变形问题 ViewGroup.LayoutParams layoutParams = picView.getLayoutParams(); boolean isRectangle = Math.abs((layoutParams.width - layoutParams.height)) > mSideMargin; if (mIsShowEncryptImage) {//显示网络加密图片 //泄漏 去掉无用的监听,避免泄漏 boolean isSkipThumbanialHead=false; CXImageLoaderUtil.getInstance(mContext).displayImage(picView, pathUtlDes, mIsDataFromNet ? DisplayImageOptionsFactory.getCloudImageOptions(mSecretKey, isSkipThumbanialHead, isRectangle) : DisplayImageOptionsFactory.getLocalSecretImageOptions(mSecretKey,hasHeader,isRectangle)); } else {//显示本地图片 mImageLoaderUtil.displayImage(picView,pathUtlDes,isRectangle? mPectanglePhotoOption: mPhotoOption); } picView.setTag(R.id.iv, pathUtlDes); } else { // 图片相同不加载 } } /** * 当 getColum()==4时每个格子点击事件回调处理 * @param view * @param childPosition */ private void setClickEvent(View view, final int childPosition) { view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(onItemClickListener != null) { onItemClickListener.onItemClick(childPosition); } } }); } public boolean isEdit() { return mIsEdit; }}
阅读全文
0 0
- RecyclerView高仿IOS照片瀑布流式展示图片效果
- 使用RecyclerView展示瀑布流的效果
- RecyclerView分别展示ListView,GrideView,瀑布流效果之总结
- recyclerview网络获取图片展示瀑布流MVP
- Recyclerview 瀑布流效果
- RecyclerView瀑布流展示数据
- 高仿ios钉钉菜单展示效果
- RecyclerView 实现瀑布流效果
- RecyclerView实现瀑布流效果
- Android RecyclerView瀑布流展示(OkHttp协议)
- RecyclerView实现图片瀑布流
- RecyclerView 瀑布流显示图片
- RecyclerView 瀑布流显示图片
- js框架jquery瀑布流图片墙效果代码下载,点击相册图片展示大图
- RecyclerView--实现 ListView,GridView,瀑布流 效果
- RecyclerView实现瀑布流效果(二)
- 利用RecyclerView实现瀑布流效果
- Android RecyclerView 实现瀑布流效果
- Java核心技術卷_7_大數值和數組
- Android加速启动Activity
- 超好用的办公软件推荐,总有一个你喜欢
- jquery实现根据控件属性模糊查询
- POJ 2796 Feel Good 单调栈的应用 代码详解
- RecyclerView高仿IOS照片瀑布流式展示图片效果
- 简单粗糙的对Biny和Laravel进行性能测试
- Android移动开发-使用MediaPlayer和SurfaceView播放视频的实现
- 1030. 完美数列(25)
- PHP--关于模板的原理和解析
- 图片细节放大镜Magic Zoom使用教程
- 编程题——马路上的路灯
- css设置不允许复制文本内容
- Java后台框架篇--Struts2.0与Action