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代码:
<strong>
</strong><span style="font-size:14px;">public class EaluationAdapter extends RecyclerView.Adapter<EaluationAdapter.EaluationHolder> {
    /**
     * 当高分辨率的时候服务器的图片显得太小,这里优化下显示比例
     */
    private Float fTimes;
    private Context mContext;
    private boolean mIsLoadImage = true;
    private ArrayList<EaluationListBean> mEaluationList;
    private EaluationGvPicAdaper mEaluationGvPicAdaper;
    private ImageLoader mImageLoader = ImageLoader.getInstance();
    private DisplayImageOptions mConfig = new DisplayImageOptions.Builder()
            .showImageForEmptyUri(R.drawable.home_youpin)
            .showImageOnFail(R.drawable.home_youpin)
            .cacheInMemory(true)// 在内存中会缓存该图片
            .cacheOnDisk(true)// 在硬盘中会缓存该图片
            .considerExifParams(true)// 会识别图片的方向信息
            .resetViewBeforeLoading(true)// 重设图片
            .build();


    public ArrayList<EaluationListBean> getmEaluationList() {
        return mEaluationList;
    }

    /**
     * 是否加载图片
     *
     * @param isLoadImage
     */
    public void setLoadImage(boolean isLoadImage) {
        this.mIsLoadImage = isLoadImage;
    }

    public EaluationAdapter(Context context) {
        this.mContext = context;
        mEaluationList = new ArrayList<>();
//        适配单图放大比例
        String sTimes = mContext.getResources().getString(R.string.times);
        fTimes = Float.valueOf(sTimes);
    }

    public void clearAdapterNotifyData() {
        mEaluationList.clear();
        notifyDataSetChanged();
    }

    public void clearAdapter() {
        mEaluationList.clear();
    }

    public void addEaluationDataAllNotifyData(ArrayList<EaluationListBean> data) {
        if (data != null) {
            mEaluationList.addAll(data);
            notifyDataSetChanged();
        }

    }

    public void addEaluationDataAll(ArrayList<EaluationListBean> data) {
        if (data != null) {
            mEaluationList.addAll(data);
        }

    }

    public void addEaluationData(EaluationListBean data) {
        if (data != null) {
            mEaluationList.add(data);
            notifyDataSetChanged();
        }

    }

    @Override
    public int getItemCount() {
        return mEaluationList.size();
    }

    @Override
    public EaluationHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_comments, parent, false);
        return new EaluationHolder(view);
    }

    @Override
    public void onBindViewHolder(EaluationHolder holder, int position) {
        EaluationListBean ealuationListBean = mEaluationList.get(position);
        List<EaluationListBean.EaluationPicBean> attachments = ealuationListBean.attachments;
        if (ealuationListBean.avatar != null) {
            mImageLoader.displayImage(ealuationListBean.avatar.smallPicUrl, holder.icon, mConfig);
            setIconClick(holder, ealuationListBean.avatar.smallPicUrl, ealuationListBean.avatar.picUrl);
        } else {
            holder.icon.setImageResource(R.drawable.home_youpin);
            setIconClick(holder, "null", "null");
        }
        holder.tv_nickname.setText(ealuationListBean.userName);
        holder.tv_text.setText(ealuationListBean.content);
        holder.tv_date.setText(ealuationListBean.creatTime);
        holder.rb_stars.setRating(ealuationListBean.grade);
        setUpImage(holder, attachments, position);
        setUpTereplys(holder, ealuationListBean.evaluatereplys);
    }

    /**
     * 设置回复内容规则
     *这里用的是自定义的LinearLayout,这样比listview消耗要小一些
     * @param holder
     * @param evaluatereplysList
     */
    private void setUpTereplys(EaluationHolder holder, List<EvaluatereplysBean> evaluatereplysList) {
        if (evaluatereplysList != null && evaluatereplysList.size() > 0) {
            holder.lv_comments_details.setVisibility(View.VISIBLE);
            EvaluatereplysAdapter evaluatereplysAdapter = new EvaluatereplysAdapter(mContext, evaluatereplysList);
            holder.lv_comments_details.setAdapter(evaluatereplysAdapter);
        } else {
            holder.lv_comments_details.setVisibility(View.GONE);
        }
    }

    /**
     * 设置图片显示规则
     *
     * @param holder
     * @param attachments
     * @param position
     */
    private void setUpImage(EaluationHolder holder, List<EaluationListBean.EaluationPicBean> attachments, int position) {
        holder.fl_image.setVisibility(View.GONE);
        if (attachments != null) {
            if (attachments.size() == 0) {
                holder.fl_image.setVisibility(View.GONE);
            } else if (attachments.size() == 1) {
                setSingleImage(attachments, holder, position);
                holder.gv_image.setVisibility(View.GONE);
                holder.iv_image.setVisibility(View.VISIBLE);
                holder.fl_image.setVisibility(View.VISIBLE);
            } else {
                holder.iv_image.setVisibility(View.GONE);
                holder.gv_image.setVisibility(View.VISIBLE);
                holder.fl_image.setVisibility(View.VISIBLE);
                setManyImage(attachments, holder, position);
            }
        } else {
            holder.fl_image.setVisibility(View.GONE);
        }
    }

    /**
     * 设置头像的点击看大图事件,这里为了方便直接把bean类进行了转换传递
     * @param holder
     * @param miniPicUrl
     * @param picUrl
     */
    private void setIconClick(EaluationHolder holder, final String miniPicUrl, final String picUrl) {
        holder.icon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(mContext, LookBigPicActivity.class);
                Bundle bundle = new Bundle();
                List<EaluationListBean.EaluationPicBean> attachments = new ArrayList<EaluationListBean.EaluationPicBean>();
                EaluationListBean.EaluationPicBean ealuationPicBean = new EaluationListBean().new EaluationPicBean();
                ealuationPicBean.imageUrl = picUrl;
                ealuationPicBean.smallImageUrl = miniPicUrl;
                attachments.add(ealuationPicBean);
                bundle.putSerializable(LookBigPicActivity.PICDATALIST, (Serializable) attachments);
                intent.putExtras(bundle);
                intent.putExtra(LookBigPicActivity.CURRENTITEM, 0);
                mContext.startActivity(intent);
//                动画处理
                startActivityAnim();
            }
        });
    }

    /**
     * 设置多图
     *
     * @param attachments
     * @param holder
     * @param position
     */
    private void setManyImage(List<EaluationListBean.EaluationPicBean> attachments, EaluationHolder holder, int position) {
//         mEaluationGvPicAdaper = (EaluationGvPicAdaper) holder.gv_image.getTag(position);
//        if(mEaluationGvPicAdaper==null){
        EaluationGvPicAdaper mEaluationGvPicAdaper = new EaluationGvPicAdaper(mContext, attachments, mIsLoadImage);
//            holder.gv_image.setTag(position,mEaluationGvPicAdaper);
        holder.gv_image.setAdapter(mEaluationGvPicAdaper);
//        }
    }

    /**
     * 设置单图
     *
     * @param attachments
     * @param holder
     */
    private void setSingleImage(final List<EaluationListBean.EaluationPicBean> attachments, final EaluationHolder holder, final int position) {
//可更具请求选择是否设置是否对单图快滑处理
//        if (mIsLoadImage) {
        mImageLoader.displayImage(attachments.get(0).smallImageUrl, holder.iv_image, mConfig, new ImageLoadingListener() {
            @Override
            public void onLoadingStarted(String imageUri, View view) {
            }

            @Override
            public void onLoadingFailed(String imageUri, View view, FailReason failReason) {

            }

            @Override
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
//                优化显示比例
                if (fTimes != 1) {
                    int height = loadedImage.getHeight();
                    int width = loadedImage.getWidth();
                    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams((int) (width * fTimes), (int) (height * fTimes));
                    holder.iv_image.setLayoutParams(params);
                }
            }

            @Override
            public void onLoadingCancelled(String imageUri, View view) {

            }
        });
        holder.iv_image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                            点击查看大图的操作
                Intent intent = new Intent(mContext, LookBigPicActivity.class);
                Bundle bundle = new Bundle();
                bundle.putSerializable(LookBigPicActivity.PICDATALIST, (Serializable) attachments);
                intent.putExtras(bundle);
                intent.putExtra(LookBigPicActivity.CURRENTITEM, 0);
                mContext.startActivity(intent);
                startActivityAnim();

            }
        });
//        }
//        优化快滑时的图片加载
       /* else {
//这样其实有时候会得不到,具体原因可以看源码里面的util,里面有详细注释
            Bitmap bitmap = mImageLoader.getMemoryCache().get(attachments.get(0).smallImageUrl);
            if (bitmap != null) {
                holder.iv_image.setImageBitmap(bitmap);
            }
        }*/
    }

    /**
     * 开始跳转动画
     */
    private void startActivityAnim() {
        ((MainActivity) mContext).overridePendingTransition(R.anim.activity2pic_in, R.anim.activity2pic_out);
    }

    static class EaluationHolder extends RecyclerView.ViewHolder {
        public CircularImage icon;
        public ImageView iv_image;
        public TextView tv_nickname;
        public TextView tv_text;
        //        可更具情况设置为emoji表情
        public TextView tv_date;
        public RatingBar rb_stars;
        public CustomGridView gv_image;
        public LinearListView lv_comments_details;
        public FrameLayout fl_image;

        public EaluationHolder(View itemView) {
            super(itemView);
            icon = (CircularImage) itemView.findViewById(R.id.icon);
            iv_image = (ImageView) itemView.findViewById(R.id.iv_image);
            tv_nickname = (TextView) itemView.findViewById(R.id.tv_nickname);
            tv_text = (TextView) itemView.findViewById(R.id.tv_text);
            tv_date = (TextView) itemView.findViewById(R.id.tv_date);
            rb_stars = (RatingBar) itemView.findViewById(R.id.rb_stars);
            gv_image = (CustomGridView) itemView.findViewById(R.id.gv_image);
            lv_comments_details = (LinearListView) itemView.findViewById(R.id.lv_comments_details);
            fl_image = (FrameLayout) itemView.findViewById(R.id.fl_image);
        }
    }

}</span>


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

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


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

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值