Android实现商城评分系统功能

概述

商城项目开发过程中,当用户购买商品完成后,需要用户对买入的商品进行打星评分,这在开发过程中似乎这个需求是必须的,每个app设计得不一样,所以评分系统也不一样,但站在技术的角度来看,其实都大同小异,只是每个公司的需要不同而已,话不多说,直接开整吧。

实现流程

  1. 效果图
20200701173347209.gif
  1. 添加依赖
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation 'com.jakewharton:butterknife:5.1.1'
    implementation 'com.google.code.gson:gson:2.3.1'
    implementation 'com.github.bumptech.glide:glide:4.5.0'
  1. 模拟用户购买成功商品数据
        //模拟数据
        String response = "{\n" +
                "    \"datas\": {\n" +
                "        \"page\": {\n" +
                "            \"page\": \"1\",\n" +
                "            \"pageCount\": 1,\n" +
                "            \"perPage\": 5,\n" +
                "            \"totalCount\": 3\n" +
                "        },\n" +
                "        \"rows\": [\n" +
                "            {\n" +
                "                \"headimg\": \"/userInfoHead/201805/97ad9a393dd242cca8b076205a2297cf.jpg\",\n" +
                "                \"items\": [\n" +
                "                    {\n" +
                "                        \"disItemId\": \"5814203\",\n" +
                "                        \"icon\": \"/newImage/product/202005/0e5edcc278eb4c8ea1ef476dab15c5ee.jpg\",\n" +
                "                        \"itemName\": \"酸系列\",\n" +
                "                        \"itemPrice\": \"8.80\",\n" +
                "                        \"massId\": \"267\",\n" +
                "                        \"num\": \"8\",\n" +
                "                        \"productId\": \"3768\",\n" +
                "                        \"skuId\": \"25241\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"disItemId\": \"5814204\",\n" +
                "                        \"icon\": \"/newImage/product/202005/0e5edcc278eb4c8ea1ef476dab15c5ee.jpg\",\n" +
                "                        \"itemName\": \"甜系列\",\n" +
                "                        \"itemPrice\": \"8.80\",\n" +
                "                        \"massId\": \"267\",\n" +
                "                        \"num\": \"2\",\n" +
                "                        \"productId\": \"3768\",\n" +
                "                        \"skuId\": \"25241\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"disItemId\": \"5814205\",\n" +
                "                        \"icon\": \"/newImage/product/202005/ff50bdcbcf7e4f4d852184336f88171f.jpg\",\n" +
                "                        \"itemName\": \"苦系列\",\n" +
                "                        \"itemPrice\": \"6.80\",\n" +
                "                        \"massId\": \"267\",\n" +
                "                        \"num\": \"4\",\n" +
                "                        \"productId\": \"3768\",\n" +
                "                        \"skuId\": \"25240\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"disItemId\": \"5814206\",\n" +
                "                        \"icon\": \"/newImage/product/202005/ff50bdcbcf7e4f4d852184336f88171f.jpg\",\n" +
                "                        \"itemName\": \"辣系列\",\n" +
                "                        \"itemPrice\": \"6.80\",\n" +
                "                        \"massId\": \"267\",\n" +
                "                        \"num\": \"2\",\n" +
                "                        \"productId\": \"3768\",\n" +
                "                        \"skuId\": \"25240\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"disItemId\": \"5814207\",\n" +
                "                        \"icon\": \"/newImage/product/202005/ff50bdcbcf7e4f4d852184336f88171f.jpg\",\n" +
                "                        \"itemName\": \"暗黑系\",\n" +
                "                        \"itemPrice\": \"6.80\",\n" +
                "                        \"massId\": \"267\",\n" +
                "                        \"num\": \"4\",\n" +
                "                        \"productId\": \"3768\",\n" +
                "                        \"skuId\": \"25240\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"disItemId\": \"5814208\",\n" +
                "                        \"icon\": \"/newImage/product/202005/ff50bdcbcf7e4f4d852184336f88171f.jpg\",\n" +
                "                        \"itemName\": \"雪白系\",\n" +
                "                        \"itemPrice\": \"6.80\",\n" +
                "                        \"massId\": \"267\",\n" +
                "                        \"num\": \"2\",\n" +
                "                        \"productId\": \"3768\",\n" +
                "                        \"skuId\": \"25240\"\n" +
                "                    },\n" +
                "                    {\n" +
                "                        \"disItemId\": \"5814209\",\n" +
                "                        \"icon\": \"/newImage/product/202005/ff50bdcbcf7e4f4d852184336f88171f.jpg\",\n" +
                "                        \"itemName\": \"粉嫩系\",\n" +
                "                        \"itemPrice\": \"6.80\",\n" +
                "                        \"massId\": \"267\",\n" +
                "                        \"num\": \"2\",\n" +
                "                        \"productId\": \"3768\",\n" +
                "                        \"skuId\": \"25240\"\n" +
                "                    }\n" +
                "                ],\n" +
                "                \"massId\": \"267\",\n" +
                "                \"nickname\": \"一叶知\",\n" +
                "                \"productId\": \"3768\"\n" +
                "            }\n" +
                "        ]\n" +
                "    },\n" +
                "    \"msg\": \"success!\",\n" +
                "    \"ret\": 0\n" +
                "}";
  1. 用户购买成功后商品列表实现

    (1) 效果图


    QQ截图20200702094822.png

(2) 实现代码

  //商品列表实现
        //数据解析
        WaitEvaluationReq delivergoodsReq = new Gson().fromJson(response, WaitEvaluationReq.class);

        if (delivergoodsReq.getRet() == 0) {
            List<WaitEvaluationReq.DatasBean.RowsBean> rowsBeanList = delivergoodsReq.getDatas().getRows();

            if (rowsBeanList != null && rowsBeanList.size() != 0) {
                //设置待评价的数据
                waitEvaluationAdapter.setData(rowsBeanList);
                mRecyclerView.setAdapter(waitEvaluationAdapter);
            }
        }
  1. 点击评价按钮进入评价打星页面
    (1) 效果图


    在这里插入图片描述

    (2) 将数据传递到评分页面实现需要评价商品的列表

            //设置需要评价的商品数据
            commentSystemAdapter.setData(itemsBeanList, tv_titlebar_right);
            recycler_view.setAdapter(commentSystemAdapter);
  1. 评分列表Adapter的实现
public class CommentSystemAdapter extends RecyclerView.Adapter<CommentSystemAdapter.ViewHolder> {

    private final Context mContext;
    private int currentStarCount;
    private int currentImgStarCount;
    private List<WaitEvaluationReq.DatasBean.RowsBean.ItemsBean> itemsBeanList;
    private TextView tv_titlebar_right;
    private OnTitlebarItemListener mDeleteListener;

    public interface OnTitlebarItemListener {
        void onClickItem(View v, List<WaitEvaluationReq.DatasBean.RowsBean.ItemsBean> itemsBeanList);
    }

    public void setOnTitlebarItemListener(OnTitlebarItemListener listener) {
        mDeleteListener = listener;
    }

    public CommentSystemAdapter(Context context) {
        this.mContext = context;
    }

    public void setData(List<WaitEvaluationReq.DatasBean.RowsBean.ItemsBean> itemsBeanList, TextView tv_titlebar_right) {
        this.itemsBeanList = itemsBeanList;
        this.tv_titlebar_right = tv_titlebar_right;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_comment_system_adapter, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int i) {

        if (itemsBeanList != null && itemsBeanList.size() != 0) {
            final WaitEvaluationReq.DatasBean.RowsBean.ItemsBean itemsBean = itemsBeanList.get(i);

            if (TextUtils.isEmpty(itemsBean.getItemName())) {
                viewHolder.text_content.setText("");
            } else {
                viewHolder.text_content.setText(itemsBean.getItemName());
            }

            //评星选择
            viewHolder.iv_comment_star_1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    currentStarCount = 1;
                    setXin(viewHolder.starList, currentStarCount, 1, i);
                }
            });

            viewHolder.iv_comment_star_2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    currentStarCount = 2;
                    setXin(viewHolder.starList, currentStarCount, 1, i);
                }
            });

            viewHolder.iv_comment_star_3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    currentStarCount = 3;
                    setXin(viewHolder.starList, currentStarCount, 1, i);
                }
            });

            viewHolder.iv_comment_star_4.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    currentStarCount = 4;
                    setXin(viewHolder.starList, currentStarCount, 1, i);
                }
            });


            viewHolder.iv_comment_star_5.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    currentStarCount = 5;
                    setXin(viewHolder.starList, currentStarCount, 1, i);
                }
            });

            viewHolder.iv_design_star_1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    currentImgStarCount = 1;
                    setXin(viewHolder.starImgList, currentImgStarCount, 2, i);
                }
            });

            viewHolder.iv_design_star_2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    currentImgStarCount = 2;
                    setXin(viewHolder.starImgList, currentImgStarCount, 2, i);
                }
            });

            viewHolder.iv_design_star_3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    currentImgStarCount = 3;
                    setXin(viewHolder.starImgList, currentImgStarCount, 2, i);
                }
            });

            viewHolder.iv_design_star_4.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    currentImgStarCount = 4;
                    setXin(viewHolder.starImgList, currentImgStarCount, 2, i);
                }
            });


            viewHolder.iv_design_star_5.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    currentImgStarCount = 5;
                    setXin(viewHolder.starImgList, currentImgStarCount, 2, i);
                }
            });

            tv_titlebar_right.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mDeleteListener.onClickItem(v, itemsBeanList);
                }
            });

            viewHolder.et_user_input.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {

                }

                @Override
                public void afterTextChanged(Editable s) {
                    //保存留言信息
                    String inputContent = viewHolder.et_user_input.getText().toString();
                    itemsBean.setRemark(inputContent);
                }
            });

        }
    }

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

    private void setXin(List<ImageView> starList, int currentStarCount, int type, int position) {

        if (itemsBeanList != null && itemsBeanList.size() != 0) {
            WaitEvaluationReq.DatasBean.RowsBean.ItemsBean itemsBean = itemsBeanList.get(position);
            if (type == 1) {
                //保存用户评价质量分数据
                itemsBean.setQuality(currentStarCount);
            } else if (type == 2) {
                //保存用户评价创意分数据
                itemsBean.setOriginality(currentStarCount);
            }
        }

        for (int i = 0, len = starList.size(); i < len; i++) {
            starList.get(i).setImageResource(i < currentStarCount ? R.drawable.grade_star_solid : R.drawable.grade_star_blank);
        }
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {

        public List<ImageView> starList = new ArrayList<>();
        public List<ImageView> starImgList = new ArrayList<>();

        @InjectView(R.id.img_shopping)
        ImageView img_shopping;
        @InjectView(R.id.text_content)
        TextView text_content;
        @InjectView(R.id.et_user_input)
        EditText et_user_input;
        @InjectView(R.id.iv_comment_star_1)
        ImageView iv_comment_star_1;
        @InjectView(R.id.iv_comment_star_2)
        ImageView iv_comment_star_2;
        @InjectView(R.id.iv_comment_star_3)
        ImageView iv_comment_star_3;
        @InjectView(R.id.iv_comment_star_4)
        ImageView iv_comment_star_4;
        @InjectView(R.id.iv_comment_star_5)
        ImageView iv_comment_star_5;
        @InjectView(R.id.iv_design_star_1)
        ImageView iv_design_star_1;
        @InjectView(R.id.iv_design_star_2)
        ImageView iv_design_star_2;
        @InjectView(R.id.iv_design_star_3)
        ImageView iv_design_star_3;
        @InjectView(R.id.iv_design_star_4)
        ImageView iv_design_star_4;
        @InjectView(R.id.iv_design_star_5)
        ImageView iv_design_star_5;


        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            ButterKnife.inject(this, itemView);

            starList.add(iv_comment_star_1);
            starList.add(iv_comment_star_2);
            starList.add(iv_comment_star_3);
            starList.add(iv_comment_star_4);
            starList.add(iv_comment_star_5);

            starImgList.add(iv_design_star_1);
            starImgList.add(iv_design_star_2);
            starImgList.add(iv_design_star_3);
            starImgList.add(iv_design_star_4);
            starImgList.add(iv_design_star_5);
        }
    }
}
  1. 用户评分打星后点击完成回调结果
       //用户评价后的回调数据
            commentSystemAdapter.setOnTitlebarItemListener(new CommentSystemAdapter.OnTitlebarItemListener() {
                @Override
                public void onClickItem(View v, List<WaitEvaluationReq.DatasBean.RowsBean.ItemsBean> itemsBeanList) {
                    if (itemsBeanList != null && itemsBeanList.size() != 0) {
                        //请求服务器接口发送用户评价的数据

                        double averageQuality = 0;
                        double averageOriginality = 0;

                        for (int i = 0; i < itemsBeanList.size(); i++) {
                            WaitEvaluationReq.DatasBean.RowsBean.ItemsBean itemsBean = itemsBeanList.get(i);
                            int quality = itemsBean.getQuality();
                            int originality = itemsBean.getOriginality();

                            averageQuality = averageQuality + quality;
                            averageOriginality = averageOriginality + originality;

                        }

                        //保留两位小数
                        DecimalFormat df = new DecimalFormat("######0.00");

                        //社团平均分的计算
                        String content = "该社团质量分:" + df.format((averageQuality / itemsBeanList.size())) +
                                ", 创意分:" + df.format((averageOriginality / itemsBeanList.size()));

                        //模拟已评价成功
                        Toast.makeText(getApplicationContext(), content, Toast.LENGTH_SHORT).show();
                        finish();
                    }
                }
            });

总结

到这里已经把整个流程跑完了,整个过程并没有复杂的东西,都是大家平时经常写的,比较难得地方应该是在列表中需要完成多个商品的打星及用户留言数据的保存,我这里的处理是当用户打完星或者输入留言之后保存数据,整个流程还是比较简单的。

需要Demo的童鞋公众号回复:“评分系统”即可获取哦

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,646评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,979评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,391评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,356评论 0 215
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,740评论 3 293
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,836评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,022评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,764评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,487评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,728评论 2 252
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,200评论 1 263
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,548评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,217评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,134评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,921评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,919评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,766评论 2 274

推荐阅读更多精彩内容