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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章