Android 多商品订单评价(类似淘宝)

ScaWGG 7年前
   <p>前几日一商城类项目,有一需求,需要对一份订单的里面几个商品进行分别评价(图片,文字内容,星级);以前都是对一份订单所有商品一起评价,那种简单的多;</p>    <p>后来,承蒙老大细心指导,终于弄出来个看起来还算凑活的,还是先贴一下效果图吧。。。</p>    <p>抖动的有点卡,gif图的问题</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/2fc560e2646d058a6a428bb45139bab0.gif"></p>    <p style="text-align:center">图片的相关操作展示.gif</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/16f448653c67590467e26e0a2096c78d.gif"></p>    <p>具体评价实现</p>    <p>*上面这张图是订单列表,可以看到有几个商品,要对这几个商品进行分条评价;</p>    <p>*这个gif图是具体的对每一个商品进行上传图片,内容,星级评价操作</p>    <p>好了,下面就来分析一下怎么写出这玩意, <strong>先从布局开始</strong> :</p>    <p>布局很好写,一看就可看出是一个listview,外加一个提交评论的按钮,给listview设置layout_weight属性,固定一下提交按钮的位置。</p>    <pre>  <code class="language-java">android:layout_weight="1"</code></pre>    <p>然后就是listview的item,主要说下上传图片那一块,我添了三个imgview,比较low,做了一些判断,选择图片的控件是单选的,只好一个一个选,这样也好,比较简单清楚。</p>    <p>画了张草图,大家可以看一下,方便理解;</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/be48133528e0a68aafebc7910d36daf0.png"></p>    <p style="text-align:center">评价示意图.png</p>    <p>着重说一下代码实现:</p>    <p>1,首先,从上个订单页面传过来每个商品的id,图片,图片用于显示,商品id用来判定评价的是哪个商品,id 和图片用两个数组存起来;</p>    <pre>  <code class="language-java">//demo中在Mainactivity.java  private List<String> img = new ArrayList<>();  private List<String> ids = new ArrayList<>();</code></pre>    <p>2,要给listview 填充数据,和获得item里面的每条数据,我们就先建一个实体类GoodsAssessBean.java,数据是下面几个,里面有几个方法,列出来(因为这是每条item的数据,所以,拿到相应的东西和方法相对好实现);</p>    <pre>  <code class="language-java">private String id;//商品id  private  String icon;//商品图片  private String content ="";//商品评价内容  private ArrayList<String> imgList = new ArrayList<>();//七牛返回的图片url  private ArrayList<Bitmap> bitmapList = new ArrayList<>();//本地的bitmap  private String starts="0";//商品星级评定     /**       *      添加或更换图片       * @param bitmap 本地 bitmap       * @param index 图片的二级位置 0 或 1 或 2;初始值为0 需要加1与 bitmapList.size()比较       * @param url 七牛返回的图片地址       */      public void addOrSetImage(Bitmap bitmap, int index, String url){          //如果小于等于证明需要更换图片;          if(index + 1 <= bitmapList.size()){              imgList.set(index, url);              bitmapList.set(index, bitmap);          }else{              //大于的话新增图片;              addBitMap(bitmap);              save(url);          }      }     /**       * 添加Bitmap       * @param bitmap       */      public void addBitMap(Bitmap bitmap){          if(bitmapList.size()<3){              bitmapList.add(bitmap);          }      }     /**       *       * @param url  每个item里面的URL       */      public void save(String url){          imgList.add(url);      }        /**       *  这个方法是把七牛返回的图片地址进行拼接,用“;”隔开       * @return       */      public String getItemUrl(){          String urls="";          if(imgList.size() > 0){              for(int i=0;i<imgList.size();i++){                  urls+= imgList.get(i)+";";              }              return urls.substring(0,urls.length()-1);          }else {              return " ";          }        }        /**       *  删除第几张图片       * @param index 第二层位置       */      public void deleteImg(int index){          if(imgList.size()>index){              imgList.remove(index);              bitmapList.remove(index);          }      }        /**       *    把每个 item(每个商品)的评价内容,星级,图片等转成json格式;       * @return       */      public String toSString(){          String str = "";          ReturnBean rb = new ReturnBean();          rb.setContent(getContent());          rb.setComment_img(getItemUrl());          rb.setGoods_num(getStarts());          rb.setOrdergoods_id(getId());          try {              str = JsonUtil.toJsonString(rb);          } catch (IOException e) {              e.printStackTrace();          }          return str;      }        public ReturnBean getReturnBean(){          ReturnBean rb = new ReturnBean();          rb.setContent(getContent());          rb.setComment_img(getItemUrl());          rb.setGoods_num(getStarts());          rb.setOrdergoods_id(getId());          return rb;      }</code></pre>    <p>3,在自己写一个图片帮助类AssessImgHelp。在这个类里,我们把写一个方法,把拿到的商品id,和商品图片存到实体类里,在这里面也有些方法,列出来。</p>    <pre>  <code class="language-java">public ArrayList<GoodsAssessBean> mBeanList = new ArrayList<>();  public AssessImgHelp(List<String> ids,List<String> icon){      for(int i=0;i<ids.size();i++){          mBeanList.add(new GoodsAssessBean(ids.get(i), icon.get(i)));      }  }      public ArrayList<GoodsAssessBean> getBeanList(){          return mBeanList;      }·        /**       *       * @param outIndex item的位置 相当于position       * @param bitmap bitmap用于本地显士       * @param url  七牛返回地址       * @param inIndex  图片位置       */      public void doQiNiuDone(int outIndex, Bitmap bitmap, String url,int inIndex){        //哪个item调用GoodsAssessBean.java里的方法,也就是添加更换图片          mBeanList.get(outIndex).addOrSetImage(BitmapUtils.compressImage(bitmap), inIndex, url);      }        //长按删除图片      public void longDelete(int outIndex,int inIndex){    //调用GoodsAssessBean.java里的删除方法          mBeanList.get(outIndex).deleteImg(inIndex);      }    //生成json串      public String jsonSString(){          String str="";          ArrayList<ReturnBean> beanList = new ArrayList<>();          for(int i=0; i< getBeanList().size(); i++){              str += getBeanList().get(i).toSString();              beanList.add(getBeanList().get(i).getReturnBean());          }          Log.e("123", "beanList" + JsonUtil.object2JSON(beanList));          return JsonUtil.object2JSON(beanList);        }</code></pre>    <p>4,最后一个帮助类AssessBeanUtils.java;存入list的position和每个item里面图片的位置,贴一下;</p>    <pre>  <code class="language-java">private int outIndex;      private int inIndex;          public void setBean(int outIndex,int inIndex){          this.outIndex = outIndex;          this.inIndex = inIndex;      }          public int getOutIndex() {          return outIndex;      }          public int getInIndex() {          return inIndex;      }</code></pre>    <p>5,好的,现在到目前为止,我们所有的数据都能拿的到,还有一些图片的删除,更换,添加等等方法全部准备完毕,剩下的只是在MainActivity中调用即可(demo中的MainActivity),着重看几个地方;</p>    <pre>  <code class="language-java">//list之外的星级判定,物流,描述等获取可以用setOnRatingBarChangeListener()方法;    mRatingBarMiaoshu.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {              @Override              public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {                  miaoshu = rating + "";              }          });    /*      * 填充数据      * */      private void showData() {          //长按图片抖动效果          final Animation anim = AnimationUtils.loadAnimation(MainActivity.this, R.anim.myanim);            mAdapter = new CommonAdapter<GoodsAssessBean>(MainActivity.this, assessImgHelp.getBeanList(), R.layout.item_assess) {              @Override              public void convert(ViewHolder helper, final GoodsAssessBean item, final int position) {                  //加载商品图片                  ImageLoad.loadImgDefault(MainActivity.this, (ImageView) helper.getView(R.id.m_assess), item.getIcon());                    //获取商品星级评价                  ((RatingBar) helper.getView(R.id.m_ratingBar_shop)).setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {                      @Override                      public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {                          item.setStarts(rating + "");                      }                  });                    //获取评价内容                  ((EditText) helper.getView(R.id.m_assess_edt)).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) {                          item.setContent(s + "");                      }                  });                  //三个imageView和三个删除按钮                  final ImageView img1 = helper.getView(R.id.m_menmian1_icon);                  final ImageView img2 = helper.getView(R.id.m_menmian2_icon);                  final ImageView img3 = helper.getView(R.id.m_menmian3_icon);                  final ImageView imgclose1 = helper.getView(R.id.m_image_one);                  final ImageView imgclose2 = helper.getView(R.id.m_image_two);                  final ImageView imgclose3 = helper.getView(R.id.m_image_three);                  img1.setScaleType(ImageView.ScaleType.CENTER_CROP);//CENTER_CROP  FIT_XY                  img2.setScaleType(ImageView.ScaleType.CENTER_CROP);//CENTER_CROP  FIT_XY                  img3.setScaleType(ImageView.ScaleType.CENTER_CROP);//CENTER_CROP  FIT_XY                  //获取本地图片数量。分别对应相应的显示                  int size = item.getBitMapListSize();                  if (size == 0) {                      setImageViewVisibility(img1, true, img2, false, img3, false);                      img1.setImageResource(R.mipmap.pj_tj);//默认图片                  } else if (size == 1) {                      setImageViewVisibility(img1, true, img2, true, img3, false);                      img1.setImageBitmap(item.getBitmapList().get(0));                      img2.setImageResource(R.mipmap.pj_tj);                  } else if (size == 2) {                      setImageViewVisibility(img1, true, img2, true, img3, true);                      img1.setImageBitmap(item.getBitmapList().get(0));                      img2.setImageBitmap(item.getBitmapList().get(1));                      img3.setImageResource(R.mipmap.pj_tj);                  } else if (size == 3) {                      setImageViewVisibility(img1, true, img2, true, img3, true);                      img1.setImageBitmap(item.getBitmapList().get(0));                      img2.setImageBitmap(item.getBitmapList().get(1));                      img3.setImageBitmap(item.getBitmapList().get(2));                  }                //点击事件                  img1.setOnClickListener(new View.OnClickListener() {                      @Override                      public void onClick(View v) {                          Log.e("123", "img: " + img1.getId());                          mAssessBean.setBean(position, 0);//存储一级二级位置                          new PopupWindows(MainActivity.this);//弹出选择头像,相册                      }                  });                  img2.setOnClickListener(new View.OnClickListener() {                      @Override                      public void onClick(View v) {                          mAssessBean.setBean(position, 1);                          new PopupWindows(MainActivity.this);                      }                  });                  img3.setOnClickListener(new View.OnClickListener() {                      @Override                      public void onClick(View v) {                          mAssessBean.setBean(position, 2);                          new PopupWindows(MainActivity.this);                      }                  });                  img1.setOnLongClickListener(new View.OnLongClickListener() {                      @Override                      public boolean onLongClick(View v) {                        //一些小细节判断,如果第一张没有图片,长按提示请选择图片                          if (assessImgHelp.getBeanList().get(position).getImgListSize() > 0) {                              img1.startAnimation(anim);//抖动效果                              imgclose1.setVisibility(View.VISIBLE);//显示删除按钮                          } else {                              toast("请添加图片");                          }                          return true;                      }                  });                  //删除按钮点击事件                  imgclose1.setOnClickListener(new View.OnClickListener() {                      @Override                      public void onClick(View v) {                          assessImgHelp.longDelete(position, 0);//调用删除方法                          mAdapter.notifyDataSetChanged();                          imgclose1.setVisibility(View.GONE);                          toast("删除成功");                        }                  });                  img2.setOnLongClickListener(new View.OnLongClickListener() {                      @Override                      public boolean onLongClick(View v) {                          if (assessImgHelp.getBeanList().get(position).getImgListSize() > 1) {                              img2.startAnimation(anim);                              imgclose2.setVisibility(View.VISIBLE);                          } else {                              toast("请添加图片");                          }                              return true;                      }                  });                  imgclose2.setOnClickListener(new View.OnClickListener() {                      @Override                      public void onClick(View v) {                          assessImgHelp.longDelete(position, 1);                          mAdapter.notifyDataSetChanged();                          imgclose2.setVisibility(View.GONE);                          toast("删除成功");                        }                  });                  img3.setOnLongClickListener(new View.OnLongClickListener() {                      @Override                      public boolean onLongClick(View v) {                          if (assessImgHelp.getBeanList().get(position).getImgListSize() > 2) {                              img3.startAnimation(anim);                              imgclose3.setVisibility(View.VISIBLE);                          } else {                              toast("请添加图片");                          }                              return true;                      }                  });                  imgclose3.setOnClickListener(new View.OnClickListener() {                      @Override                      public void onClick(View v) {                          assessImgHelp.longDelete(position, 2);                          mAdapter.notifyDataSetChanged();                          imgclose3.setVisibility(View.GONE);                          toast("删除成功");                        }                  });              }            };          mAssessList.setAdapter(mAdapter);      }  //图片的显示与隐藏  public void setImageViewVisibility(ImageView img1, boolean boo1, ImageView img2, boolean boo2, ImageView img3, boolean boo3) {          img1.setVisibility(boo1 ? View.VISIBLE : View.GONE);          img2.setVisibility(boo2 ? View.VISIBLE : View.GONE);          img3.setVisibility(boo3 ? View.VISIBLE : View.GONE);      }</code></pre>    <p>后面的就是一些调用相册,相机,选取图片,上传七牛,还有就是6.0权限问题也有判断。</p>    <p>七牛上传成功之后,调这个方法:</p>    <pre>  <code class="language-java">//第一个是position,第三个是七牛返回的图片地址,第四个是图片位置;  assessImgHelp.doQiNiuDone(mAssessBean.getOutIndex(), bitmap, key, mAssessBean.getInIndex());</code></pre>    <h3> </h3>    <p> </p>    <p>来自:http://www.jianshu.com/p/17763c96bfc4</p>    <p> </p>