• 社交里互评、点赞的实现


    一、首先说互评:今天朋友圈里要实现用户相互评论回复的功能,不同的用户对其他用户上传的图片进行评论,同时也要对用户评论的内容及进行回复。。

    这里面要理清的几个逻辑:

    A上传了图片:

                      1、B可以直接点击界面上的评论按钮,对A的图片进行评论

                      2、C可以点击B的评论,然后进行评论回复

                      3、A对B(或者C)进行回复

    这里面的要解决的问题:

                     1、评论编辑框的弹出有两个入口:

                               1.1 点击评论图标 ,编辑框的hint是”回复 :上传图片的用户“

                               1.2 点击评论内容 ,编辑框的hint是”回复:此条评论的发起人“

           并且二者都是绑定了相同的监听器,监听内容就是监听到用户点击评论图标、或者评论的内容,都会展开这个comment_layout,然后编辑框里面的hint显示出来。由于不同的入口,编辑框里面的hint内容不一样,因此这个监听器就要判断用户是点击了哪个控件,根据传入的控件的id进行判断,然后在执行相应的操作。

         下面看一下监听器的参数:

    private Button.OnClickListener btnCommentListener = new Button.OnClickListener() {  
            @Override
            public void onClick(View arg0) {
                
                if(arg0.getId()== R.id.imgbtn_comment){//如果是点击评论图标
                comment_layout.setVisibility(View.VISIBLE);
                comment_ediText.setHint(" 回复  " + users_name+ " : ");
                
                flag_comment = 0; //这里的标志位是为了区分两种方式,从而在后面执行提交评论异步任务传参的时候进行区分
                
                }
                else{//如果是点击评论内容
                    
                    TextView txtCommentNew = (TextView)arg0; //获取传进来的textview,就是单条评论内容
                    String txtComment1 = txtCommentNew.getText().toString(); 
                    String txtCommentsplit[] = txtComment1.split(" "); /取出评论内容里面的评论的发起人
                    replyed_user = txtCommentsplit[0];
                    if(!replyed_user.equals(ARUtils.username)){
                    comment_layout.setVisibility(View.VISIBLE);
                    comment_ediText.setHint(" 回复  " + replyed_user + " : ");
                    
                    flag_comment = 1;
                    }else Toast.makeText(mContext, "您不能对自己评论。", Toast.LENGTH_SHORT).show();//如果评论的发起人就是用户自己,判断一下
                    
                }
                }
        };

     上面完成了对用户进入评论的入口进行判断,又有一个问题,就是提交评论异步任务的时候,我给服务器传的参数不同,因为被评论人是不一样的,这样我在程序里面设置了一个全局变量,标志位flag_comment,用于区分用户是点击评论图标对图片上传的用户进行直接评论,还是点击评论内容对评论的发起人进行回复:

        //发送评论异步任务
        
        class webTaskForComment  extends AsyncTask<String, String, String>
        {    
            @Override
            protected String doInBackground(String... params) 
            {
                ArrayList<NameValuePair> paramsToPass = new ArrayList<NameValuePair>();
                    paramsToPass.add(new BasicNameValuePair("comment_users", params[0]));
                    paramsToPass.add(new BasicNameValuePair("commented_users", params[1]));
                    paramsToPass.add(new BasicNameValuePair("comment_contents", params[2]));
                    paramsToPass.add(new BasicNameValuePair("passWord", params[3]));
                    paramsToPass.add(new BasicNameValuePair("picture_id", params[4]));
                    
                String serverResp = "未获得数据,请稍候重试…";
                    try {
                        HttpPost postReq = new HttpPost(commentApiUrl);
                            postReq.setEntity(new UrlEncodedFormEntity(paramsToPass, HTTP.UTF_8));
                            
                            HttpResponse response = ARUtils.GetHttpClient().execute(postReq);
    
                            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                                serverResp = EntityUtils.toString(response.getEntity());
                                try {
                                    JSONObject jObject = new JSONObject(serverResp);
                                    serverResp = jObject.getString("status");
                                     
                                } catch (JSONException e) {
                                    serverResp = "服务器端错误";
                                }
                            } else if (response.getStatusLine().getStatusCode() == HttpStatus.SC_FORBIDDEN) {
                                serverResp = EntityUtils.toString(response.getEntity());
                                try {
                                    JSONObject jObject = new JSONObject(serverResp);
                                    serverResp = jObject.getString("status");
                                    
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                    serverResp = "服务器端错误";
                                }
                            } else {
                                serverResp = "网络连接错误";
                            }
                        } catch (ClientProtocolException e) {
                            Log.d("protocolException", e.getMessage());
                        } catch (IOException e) {
                            Log.d("IOException", e.getMessage());
                    }
    
                        return serverResp;    
                    
            }    
    
            
            @Override
            protected void onPostExecute(String result) 
            {
                super.onPostExecute(result);
                 if (result.equalsIgnoreCase("success")){
             
                     if(flag_comment == 0){//如果直接回复,更新ui
                            comment_content_item =  comment_ediText.getText().toString();
                            SpannableStringBuilder comment_item = setUserStyle(ARUtils.username);
                            comment_item.append(" : ");
                            SpannableStringBuilder comment_item1 = setContentStyle(comment_ediText.getText().toString());
                                
                            comment_item.append(comment_item1);
                                
                            TextView txtComment = new TextView(mContext);
                             txtComment.setText(comment_item);
                             comment_layout.setVisibility(View.GONE);
                             linearComment.addView(txtComment);
                             
                            }
                            
                            if(flag_comment == 1){//如果在评论里进行回复,更新ui
                                
                            comment_content_item =  comment_ediText.getText().toString();
                            SpannableStringBuilder comment_item = setUserStyle(ARUtils.username);
                            SpannableStringBuilder comment_item1 = setContentStyle(" 回复 ");
                            SpannableStringBuilder comment_item2 = setUserStyle(replyed_user);
                            SpannableStringBuilder comment_item3 = setContentStyle(comment_ediText.getText().toString());
                            
                            comment_item.append(comment_item1);
                            comment_item.append(comment_item2);    
                            comment_item.append(" : ");
                            comment_item.append(comment_item3);
                            
                            
                            TextView txtComment = new TextView(mContext);
                             txtComment.setText(comment_item);
                             comment_layout.setVisibility(View.GONE);
                             linearComment.addView(txtComment);
                                
                            }
                     
                     
                     
                     Toast.makeText(mContext, "评论成功!", Toast.LENGTH_SHORT).show();
                     
                     comment_ediText.setText("");
                 }else Toast.makeText(mContext, "评论失败,请稍后重试。。。", Toast.LENGTH_SHORT).show();
                
                
            }
        
        }

    更新ui的操作最好放在post函数里面,而不是执行异步任务之前,用户万一没提交成功,是i不能更新ui的。。

    二、点赞的实现:

           点赞就相比容易多了,但是在过程中也出现了一个逗比的小问题:布局文件里的”ok“。。。

    就是在没有人点赞的时候,但是朋友圈的点赞列表就逗比的出现了一个“ok”,后来调试也没检查出问题,这时看了下点赞列表的布局文件,原来我在那里的textview里赋了个初值“ok”,是为了调布局的时候看其位置。。。

    并且也有一个问题需要用到全局标志位flag_like,就是点赞列表的ui更新问题。

    一个图片在没有点赞之前,第一个点赞用户的应该是直接显示在点赞列表的textview里的,如过已经有点赞人了,那么后续的点赞用户更新ui的时候,需要先在原来点赞用户列表的后面append “,”,然后在append点赞用户。

    我的点赞列表是个textview,点赞用户都用的richTex,然后setText方法加载到控件上,这个richText声明为全局变量,便于在后面更新ui的时候引用:

     //设置点赞列表,infoPack[4]里面是点赞的用户,用|分隔
                if(!infoPack[4].equals("")) //如果有点赞人
                    {
                    
                    String like_users = infoPack[4].replace("|", " , ");            
                    strNameSpan = setUserStyle(like_users);
                    linear_likes.setText(strNameSpan);
                    flag_like = 1;   //点赞标志位设为1
                    
                   }else  flag_like = 0;
    //点赞按钮响应
        private Button.OnClickListener btnLikeListener = new Button.OnClickListener() {  
            @Override
            public void onClick(View arg0) {
        
                //建立网络连接,执行点赞异步任务,将点赞内容发送给服务器
                ConnectivityManager connMgr = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
                if (networkInfo != null && networkInfo.isConnected()){
                    
                    String likeData[] = { "",  "" , "", ""};
                    likeData[0] = ARUtils.username; //点赞人,就是登陆的用户名
                    likeData[1] = users_name;  //被点赞人
                    
                    likeData[2] = ARUtils.password; 
                    
                    likeData[3] = pic_id; 
                    //likeData[3] = "2"; 
                    webTaskForLike asyncWebForLike = new webTaskForLike();
                    if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.GINGERBREAD_MR1) {
                        asyncWebForLike.executeOnExecutor(
                                webTaskForLike.THREAD_POOL_EXECUTOR, likeData);
                    } else {
                        asyncWebForLike.execute(likeData);
                    }
                
                }
                
                
                }
        };
    class webTaskForLike  extends AsyncTask<String, String, String>                         //点赞异步任务
        {    
            @Override
            protected String doInBackground(String... params) 
            {
                ArrayList<NameValuePair> paramsToPass = new ArrayList<NameValuePair>();
                    paramsToPass.add(new BasicNameValuePair("userName", params[0]));
                    paramsToPass.add(new BasicNameValuePair("picture_id", params[3]));
                    
                    paramsToPass.add(new BasicNameValuePair("passWord", params[2]));
                    
                String serverResp = "未获得数据,请稍候重试…";
                    try {
                        HttpPost postReq = new HttpPost(likeApiUrl);
                            postReq.setEntity(new UrlEncodedFormEntity(paramsToPass, HTTP.UTF_8));
                            
                            HttpResponse response = ARUtils.GetHttpClient().execute(postReq);
    
                            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                                serverResp = EntityUtils.toString(response.getEntity());
                                try {
                                    JSONObject jObject = new JSONObject(serverResp);
                                    serverResp = jObject.getString("status");
                                     
                                } catch (JSONException e) {
                                    serverResp = "服务器端错误";
                                }
                            } else if (response.getStatusLine().getStatusCode() == HttpStatus.SC_FORBIDDEN) {
                                serverResp = EntityUtils.toString(response.getEntity());
                                try {
                                    JSONObject jObject = new JSONObject(serverResp);
                                    serverResp = jObject.getString("status");
                                    
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                    serverResp = "服务器端错误";
                                }
                            } else {
                                serverResp = "网络连接错误";
                            }
                        } catch (ClientProtocolException e) {
                            Log.d("protocolException", e.getMessage());
                        } catch (IOException e) {
                            Log.d("IOException", e.getMessage());
                    }
    
                        return serverResp;    
                    
            }    
    
            
            @Override
            protected void onPostExecute(String result) 
            {
                super.onPostExecute(result);
                 if (result.equalsIgnoreCase("success")){
             
                     if(flag_like == 1 ){//如果已经存在点赞人
                            SpannableStringBuilder like_item = setUserStyle(ARUtils.username);
                            strNameSpan.append(", ");
                            strNameSpan.append(like_item);
                            linear_likes.setText(strNameSpan);
                        }else {//否则设置第一个点赞人
                            SpannableStringBuilder like_item = setUserStyle(ARUtils.username);
                            linear_likes.setText(like_item);
                        } 
                     
                     Toast.makeText(mContext, "点赞成功!", Toast.LENGTH_SHORT).show();
                 }//else Toast.makeText(mContext, "点赞失败,请稍后重试。。。", Toast.LENGTH_SHORT).show();
                 if (result.equalsIgnoreCase("like_exist")){
                     
                         Toast.makeText(mContext, "您已点过赞", Toast.LENGTH_SHORT).show();
                     }
                 if (result.equalsIgnoreCase("like_fail")){
                     
                     Toast.makeText(mContext, "点赞失败,请稍后重试。。。", Toast.LENGTH_SHORT).show();
                     }
                    
                
            }
        
        }

    error:

    总结一下期间出现过的问题:   1、    首先说监听器的绑定,点击评论内容事件、点击评论按钮绑定了不同的评论布局弹出监听器,虽然他们是操作不太一样,但是可以通过根据点击                                的控件id来区分,这样他们可以共用布局里面的发送按钮监听器了(还是师兄逻辑清楚。。。程序要尽可能地逻辑简单)

                                             2、    监听器里的内容取replyedUser时候,出现了混乱,因为局部变量的使用很容易混淆

                                             3、     不能重复点赞、不能对自己的评论进行回复。。。这些师兄提醒的细节,注意点啦。。

                                         

  • 相关阅读:
    Single Page Application
    ES6数组方法
    localStorage 和 sessionStorage
    border-color:transparent;
    自适应屏幕高度铺满全屏
    href="#"与javascript:void(0)的区别
    图片模式CMYK和RGB在浏览器下的变化
    IE css HACK
    z-index只能用在定位元素上
    mysql锁机制之间隙锁(Next-Key锁)(五)
  • 原文地址:https://www.cnblogs.com/lucky-star-star/p/3702036.html
Copyright © 2020-2023  润新知