android 微信朋友圈效果(附完整注释)

来源:互联网 发布:迅龙数据恢复 注册码 编辑:程序博客网 时间:2024/05/18 03:10

请尊重原创,转载请注明出处: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

5 0
原创粉丝点击