Android 防微信朋友圈功能

请尊重原创,转载请注明出处:http://blog.csdn.net/mabeijianxi/article/details/50533703

先看下效果图


源码地址:https://github.com/mabeijianxi/Circle-of-friends

源码的核心类(adapter)里面几乎对每个方法都有注解。本demo主要想分享的是:

  • listview各种嵌套处理
  • listview的优化处理
  • 用ImageLoader的一些特殊方式来优化图片加载
  • listview的高度封装操作(刷新、加载更多、ui操作等)
  • Activity动画的灵活应用
下面贴出的是主界面的adapter代码:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <strong>  
  2. </strong><span style="font-size:14px;">public class EaluationAdapter extends RecyclerView.Adapter<EaluationAdapter.EaluationHolder> {  
  3.     /** 
  4.      * 当高分辨率的时候服务器的图片显得太小,这里优化下显示比例 
  5.      */  
  6.     private Float fTimes;  
  7.     private Context mContext;  
  8.     private boolean mIsLoadImage = true;  
  9.     private ArrayList<EaluationListBean> mEaluationList;  
  10.     private EaluationGvPicAdaper mEaluationGvPicAdaper;  
  11.     private ImageLoader mImageLoader = ImageLoader.getInstance();  
  12.     private DisplayImageOptions mConfig = new DisplayImageOptions.Builder()  
  13.             .showImageForEmptyUri(R.drawable.home_youpin)  
  14.             .showImageOnFail(R.drawable.home_youpin)  
  15.             .cacheInMemory(true)// 在内存中会缓存该图片  
  16.             .cacheOnDisk(true)// 在硬盘中会缓存该图片  
  17.             .considerExifParams(true)// 会识别图片的方向信息  
  18.             .resetViewBeforeLoading(true)// 重设图片  
  19.             .build();  
  20.   
  21.   
  22.     public ArrayList<EaluationListBean> getmEaluationList() {  
  23.         return mEaluationList;  
  24.     }  
  25.   
  26.     /** 
  27.      * 是否加载图片 
  28.      * 
  29.      * @param isLoadImage 
  30.      */  
  31.     public void setLoadImage(boolean isLoadImage) {  
  32.         this.mIsLoadImage = isLoadImage;  
  33.     }  
  34.   
  35.     public EaluationAdapter(Context context) {  
  36.         this.mContext = context;  
  37.         mEaluationList = new ArrayList<>();  
  38. //        适配单图放大比例  
  39.         String sTimes = mContext.getResources().getString(R.string.times);  
  40.         fTimes = Float.valueOf(sTimes);  
  41.     }  
  42.   
  43.     public void clearAdapterNotifyData() {  
  44.         mEaluationList.clear();  
  45.         notifyDataSetChanged();  
  46.     }  
  47.   
  48.     public void clearAdapter() {  
  49.         mEaluationList.clear();  
  50.     }  
  51.   
  52.     public void addEaluationDataAllNotifyData(ArrayList<EaluationListBean> data) {  
  53.         if (data != null) {  
  54.             mEaluationList.addAll(data);  
  55.             notifyDataSetChanged();  
  56.         }  
  57.   
  58.     }  
  59.   
  60.     public void addEaluationDataAll(ArrayList<EaluationListBean> data) {  
  61.         if (data != null) {  
  62.             mEaluationList.addAll(data);  
  63.         }  
  64.   
  65.     }  
  66.   
  67.     public void addEaluationData(EaluationListBean data) {  
  68.         if (data != null) {  
  69.             mEaluationList.add(data);  
  70.             notifyDataSetChanged();  
  71.         }  
  72.   
  73.     }  
  74.   
  75.     @Override  
  76.     public int getItemCount() {  
  77.         return mEaluationList.size();  
  78.     }  
  79.   
  80.     @Override  
  81.     public EaluationHolder onCreateViewHolder(ViewGroup parent, int viewType) {  
  82.         View view = LayoutInflater.from(mContext).inflate(R.layout.item_comments, parent, false);  
  83.         return new EaluationHolder(view);  
  84.     }  
  85.   
  86.     @Override  
  87.     public void onBindViewHolder(EaluationHolder holder, int position) {  
  88.         EaluationListBean ealuationListBean = mEaluationList.get(position);  
  89.         List<EaluationListBean.EaluationPicBean> attachments = ealuationListBean.attachments;  
  90.         if (ealuationListBean.avatar != null) {  
  91.             mImageLoader.displayImage(ealuationListBean.avatar.smallPicUrl, holder.icon, mConfig);  
  92.             setIconClick(holder, ealuationListBean.avatar.smallPicUrl, ealuationListBean.avatar.picUrl);  
  93.         } else {  
  94.             holder.icon.setImageResource(R.drawable.home_youpin);  
  95.             setIconClick(holder, "null""null");  
  96.         }  
  97.         holder.tv_nickname.setText(ealuationListBean.userName);  
  98.         holder.tv_text.setText(ealuationListBean.content);  
  99.         holder.tv_date.setText(ealuationListBean.creatTime);  
  100.         holder.rb_stars.setRating(ealuationListBean.grade);  
  101.         setUpImage(holder, attachments, position);  
  102.         setUpTereplys(holder, ealuationListBean.evaluatereplys);  
  103.     }  
  104.   
  105.     /** 
  106.      * 设置回复内容规则 
  107.      *这里用的是自定义的LinearLayout,这样比listview消耗要小一些 
  108.      * @param holder 
  109.      * @param evaluatereplysList 
  110.      */  
  111.     private void setUpTereplys(EaluationHolder holder, List<EvaluatereplysBean> evaluatereplysList) {  
  112.         if (evaluatereplysList != null && evaluatereplysList.size() > 0) {  
  113.             holder.lv_comments_details.setVisibility(View.VISIBLE);  
  114.             EvaluatereplysAdapter evaluatereplysAdapter = new EvaluatereplysAdapter(mContext, evaluatereplysList);  
  115.             holder.lv_comments_details.setAdapter(evaluatereplysAdapter);  
  116.         } else {  
  117.             holder.lv_comments_details.setVisibility(View.GONE);  
  118.         }  
  119.     }  
  120.   
  121.     /** 
  122.      * 设置图片显示规则 
  123.      * 
  124.      * @param holder 
  125.      * @param attachments 
  126.      * @param position 
  127.      */  
  128.     private void setUpImage(EaluationHolder holder, List<EaluationListBean.EaluationPicBean> attachments, int position) {  
  129.         holder.fl_image.setVisibility(View.GONE);  
  130.         if (attachments != null) {  
  131.             if (attachments.size() == 0) {  
  132.                 holder.fl_image.setVisibility(View.GONE);  
  133.             } else if (attachments.size() == 1) {  
  134.                 setSingleImage(attachments, holder, position);  
  135.                 holder.gv_image.setVisibility(View.GONE);  
  136.                 holder.iv_image.setVisibility(View.VISIBLE);  
  137.                 holder.fl_image.setVisibility(View.VISIBLE);  
  138.             } else {  
  139.                 holder.iv_image.setVisibility(View.GONE);  
  140.                 holder.gv_image.setVisibility(View.VISIBLE);  
  141.                 holder.fl_image.setVisibility(View.VISIBLE);  
  142.                 setManyImage(attachments, holder, position);  
  143.             }  
  144.         } else {  
  145.             holder.fl_image.setVisibility(View.GONE);  
  146.         }  
  147.     }  
  148.   
  149.     /** 
  150.      * 设置头像的点击看大图事件,这里为了方便直接把bean类进行了转换传递 
  151.      * @param holder 
  152.      * @param miniPicUrl 
  153.      * @param picUrl 
  154.      */  
  155.     private void setIconClick(EaluationHolder holder, final String miniPicUrl, final String picUrl) {  
  156.         holder.icon.setOnClickListener(new View.OnClickListener() {  
  157.             @Override  
  158.             public void onClick(View v) {  
  159.                 Intent intent = new Intent(mContext, LookBigPicActivity.class);  
  160.                 Bundle bundle = new Bundle();  
  161.                 List<EaluationListBean.EaluationPicBean> attachments = new ArrayList<EaluationListBean.EaluationPicBean>();  
  162.                 EaluationListBean.EaluationPicBean ealuationPicBean = new EaluationListBean().new EaluationPicBean();  
  163.                 ealuationPicBean.imageUrl = picUrl;  
  164.                 ealuationPicBean.smallImageUrl = miniPicUrl;  
  165.                 attachments.add(ealuationPicBean);  
  166.                 bundle.putSerializable(LookBigPicActivity.PICDATALIST, (Serializable) attachments);  
  167.                 intent.putExtras(bundle);  
  168.                 intent.putExtra(LookBigPicActivity.CURRENTITEM, 0);  
  169.                 mContext.startActivity(intent);  
  170. //                动画处理  
  171.                 startActivityAnim();  
  172.             }  
  173.         });  
  174.     }  
  175.   
  176.     /** 
  177.      * 设置多图 
  178.      * 
  179.      * @param attachments 
  180.      * @param holder 
  181.      * @param position 
  182.      */  
  183.     private void setManyImage(List<EaluationListBean.EaluationPicBean> attachments, EaluationHolder holder, int position) {  
  184. //         mEaluationGvPicAdaper = (EaluationGvPicAdaper) holder.gv_image.getTag(position);  
  185. //        if(mEaluationGvPicAdaper==null){  
  186.         EaluationGvPicAdaper mEaluationGvPicAdaper = new EaluationGvPicAdaper(mContext, attachments, mIsLoadImage);  
  187. //            holder.gv_image.setTag(position,mEaluationGvPicAdaper);  
  188.         holder.gv_image.setAdapter(mEaluationGvPicAdaper);  
  189. //        }  
  190.     }  
  191.   
  192.     /** 
  193.      * 设置单图 
  194.      * 
  195.      * @param attachments 
  196.      * @param holder 
  197.      */  
  198.     private void setSingleImage(final List<EaluationListBean.EaluationPicBean> attachments, final EaluationHolder holder, final int position) {  
  199. //可更具请求选择是否设置是否对单图快滑处理  
  200. //        if (mIsLoadImage) {  
  201.         mImageLoader.displayImage(attachments.get(0).smallImageUrl, holder.iv_image, mConfig, new ImageLoadingListener() {  
  202.             @Override  
  203.             public void onLoadingStarted(String imageUri, View view) {  
  204.             }  
  205.   
  206.             @Override  
  207.             public void onLoadingFailed(String imageUri, View view, FailReason failReason) {  
  208.   
  209.             }  
  210.   
  211.             @Override  
  212.             public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {  
  213. //                优化显示比例  
  214.                 if (fTimes != 1) {  
  215.                     int height = loadedImage.getHeight();  
  216.                     int width = loadedImage.getWidth();  
  217.                     FrameLayout.LayoutParams params = new FrameLayout.LayoutParams((int) (width * fTimes), (int) (height * fTimes));  
  218.                     holder.iv_image.setLayoutParams(params);  
  219.                 }  
  220.             }  
  221.   
  222.             @Override  
  223.             public void onLoadingCancelled(String imageUri, View view) {  
  224.   
  225.             }  
  226.         });  
  227.         holder.iv_image.setOnClickListener(new View.OnClickListener() {  
  228.             @Override  
  229.             public void onClick(View v) {  
  230. //                            点击查看大图的操作  
  231.                 Intent intent = new Intent(mContext, LookBigPicActivity.class);  
  232.                 Bundle bundle = new Bundle();  
  233.                 bundle.putSerializable(LookBigPicActivity.PICDATALIST, (Serializable) attachments);  
  234.                 intent.putExtras(bundle);  
  235.                 intent.putExtra(LookBigPicActivity.CURRENTITEM, 0);  
  236.                 mContext.startActivity(intent);  
  237.                 startActivityAnim();  
  238.   
  239.             }  
  240.         });  
  241. //        }  
  242. //        优化快滑时的图片加载  
  243.        /* else { 
  244. //这样其实有时候会得不到,具体原因可以看源码里面的util,里面有详细注释 
  245.             Bitmap bitmap = mImageLoader.getMemoryCache().get(attachments.get(0).smallImageUrl); 
  246.             if (bitmap != null) { 
  247.                 holder.iv_image.setImageBitmap(bitmap); 
  248.             } 
  249.         }*/  
  250.     }  
  251.   
  252.     /** 
  253.      * 开始跳转动画 
  254.      */  
  255.     private void startActivityAnim() {  
  256.         ((MainActivity) mContext).overridePendingTransition(R.anim.activity2pic_in, R.anim.activity2pic_out);  
  257.     }  
  258.   
  259.     static class EaluationHolder extends RecyclerView.ViewHolder {  
  260.         public CircularImage icon;  
  261.         public ImageView iv_image;  
  262.         public TextView tv_nickname;  
  263.         public TextView tv_text;  
  264.         //        可更具情况设置为emoji表情  
  265.         public TextView tv_date;  
  266.         public RatingBar rb_stars;  
  267.         public CustomGridView gv_image;  
  268.         public LinearListView lv_comments_details;  
  269.         public FrameLayout fl_image;  
  270.   
  271.         public EaluationHolder(View itemView) {  
  272.             super(itemView);  
  273.             icon = (CircularImage) itemView.findViewById(R.id.icon);  
  274.             iv_image = (ImageView) itemView.findViewById(R.id.iv_image);  
  275.             tv_nickname = (TextView) itemView.findViewById(R.id.tv_nickname);  
  276.             tv_text = (TextView) itemView.findViewById(R.id.tv_text);  
  277.             tv_date = (TextView) itemView.findViewById(R.id.tv_date);  
  278.             rb_stars = (RatingBar) itemView.findViewById(R.id.rb_stars);  
  279.             gv_image = (CustomGridView) itemView.findViewById(R.id.gv_image);  
  280.             lv_comments_details = (LinearListView) itemView.findViewById(R.id.lv_comments_details);  
  281.             fl_image = (FrameLayout) itemView.findViewById(R.id.fl_image);  
  282.         }  
  283.     }  
  284.   
  285. }</span>  


主要对单图与多图处理,对滑动优化处理,其实还开了硬件加速(Android:hardwareAccelerated="true"),这样可以最大程度让listview顺畅,大图查看模仿了QQ空间的查看模式,具体的可以看源码里面的几个adapter。

能力有限,如有不足的地方欢迎指出。


源码地址:https://github.com/mabeijianxi/Circle-of-friends

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值