1

我正在創建應用程序,其中我提供了Facebook時間線等功能,用戶可以更新他們的故事,任何用戶都可以喜歡或評論故事。一切工作正常,但我面臨的問題是,當任何用戶更新故事,然後更新故事的數據保存在服務器上,但不是在回收視圖中同時添加。當用戶返回時間線屏幕上,然後列表將得到更新。我怎麼解決這個問題 ?如何更新RecycleView中的項目?

定義適配器

public class TimeLineListAdapter extends RecyclerView.Adapter<TimeLineListAdapter.ViewHolder> { 
    private List<TimeLineItem> timeLineItems; 
    String message, storyId, token; 
    private Context context; 
    ImageLoader imageLoader = AppController.getInstance().getImageLoader(); 

    public TimeLineListAdapter(List<TimeLineItem> timeLineItems, Context context) { 
     super(); 
     this.context = context; 
     this.timeLineItems = timeLineItems; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.timeline_item, parent, false); 
     ViewHolder viewHolder = new ViewHolder(v); 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, final int position) { 

     //Getting the particular item from the list 
     TimeLineItem item = timeLineItems.get(position); 

     if (item.getTotalLikes().equals("0")){ 
      holder.txtLike.setText(""); 
     }else { 
      holder.txtLike.setText(item.getTotalLikes()); 
     } 

     if (item.getTotalComment().equals("0")){ 
      holder.txtComment.setText(""); 
     }else { 
      holder.txtComment.setText("("+item.getTotalComment()+")"); 
     } 

     if (item.getIsLike() == 0){ 

     }else { 
      holder.imageLike.setImageBitmap(null); 
      holder.imageLike.setBackgroundResource(R.drawable.islike); 
      holder.txtLike.setTextColor(Color.parseColor("#3498db")); 
     } 

     holder.name.setText(item.getName() + " " + item.getLname()); 


     /*Long.parseLong(item.getTimeStamp()), 
       System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS);*/ 
     holder.timestamp.setText(item.getTimeStamp()); 

     // Chcek for empty status message 
     if (!TextUtils.isEmpty(item.getStatus())) { 
      holder.statusMsg.setText(item.getStatus()); 
      holder.statusMsg.setVisibility(View.VISIBLE); 
     } else { 
      // status is empty, remove from view 
      holder.statusMsg.setVisibility(View.GONE); 
     } 

     // Checking for null feed url 
     if (item.getUrl() != null) { 
      holder.url.setText(Html.fromHtml("<a href=\"" + item.getUrl() + "\">" 
        + item.getUrl() + "</a> ")); 

      // Making url clickable 
      holder.url.setMovementMethod(LinkMovementMethod.getInstance()); 
      holder.url.setVisibility(View.VISIBLE); 
     } else { 
      // url is null, remove from the view 
      holder.url.setVisibility(View.GONE); 
     } 

     // user profile pic 
     holder.profilePic.setImageUrl(item.getProfilePic(), imageLoader); 

     // Feed image 
     if (item.getImge() != null) { 
      holder.feedImageView.setImageUrl(item.getImge(), imageLoader); 
      holder.feedImageView.setVisibility(View.VISIBLE); 
      holder.feedImageView 
        .setResponseObserver(new TimeLineImageView.ResponseObserver() { 
         @Override 
         public void onError() { 
         } 

         @Override 
         public void onSuccess() { 
         } 
        }); 
     } else { 
      holder.feedImageView.setVisibility(View.GONE); 
     } 

     holder.txtComment.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       final TimeLineItem m = timeLineItems.get(position); 
       String ide = String.valueOf(m.getId()); 

       Intent intent = new Intent(context, StoryDetailActivity.class); 
       intent.putExtra("storyId",ide); 
       context.startActivity(intent); 
      } 
     }); 

     holder.txtCommentLabel.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       final TimeLineItem m = timeLineItems.get(position); 
       String ide = String.valueOf(m.getId()); 

       Intent intent = new Intent(context, StoryDetailActivity.class); 
       intent.putExtra("storyId",ide); 
       context.startActivity(intent); 
      } 
     }); 


     holder.imageLike.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 

       TimelineActivity t = new TimelineActivity(); 

       final TimeLineItem m = timeLineItems.get(position); 
       String ide = String.valueOf(m.getId()); 

       likeStory(ide,t.token); 

       return false; 
      } 
     }); 

    } 

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

    class ViewHolder extends RecyclerView.ViewHolder{ 

     TextView name, timestamp, statusMsg, url, txtLike, txtComment, txtCommentLabel; 
     NetworkImageView profilePic; 
     TimeLineImageView feedImageView; 
     ImageView imageLike; 

     //Initializing Views 
     public ViewHolder(View itemView) { 
      super(itemView); 
      name = (TextView) itemView.findViewById(R.id.name); 
      timestamp = (TextView) itemView.findViewById(R.id.timestamp); 
      statusMsg = (TextView) itemView.findViewById(R.id.txtStatusMsg); 
      url = (TextView) itemView.findViewById(R.id.txtUrl); 
      profilePic = (NetworkImageView) itemView.findViewById(R.id.profilePic); 
      feedImageView = (TimeLineImageView) itemView.findViewById(R.id.feedImage1); 
      imageLike = (ImageView) itemView.findViewById(R.id.imgLike); 
      txtLike = (TextView) itemView.findViewById(R.id.txtLike); 
      txtComment = (TextView) itemView.findViewById(R.id.txtComment); 
      txtCommentLabel = (TextView) itemView.findViewById(R.id.txtCommentLabel); 
     } 
    } 

    private void likeStory(final String story_id, final String token) { 
     // Tag used to cancel the request 
     String tag_string_req = "req_register"; 

     StringRequest strReq = new StringRequest(Request.Method.POST, AppConfig.likeStory, new Response.Listener<String>() { 

      @Override 
      public void onResponse(String response) { 

       try { 
        JSONObject jObj = new JSONObject(response); 
        boolean error = jObj.getBoolean("status"); 
        message = jObj.getString("message"); 
        if (error) { 

        } else { 

        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       Toast.makeText(context, "Oops something went wrong...", Toast.LENGTH_LONG).show(); 
      } 
     }) { 

      @Override 
      protected Map<String 
        , String> getParams() { 
       // Posting params to register url 
       Map<String, String> params = new HashMap<String, String>(); 
       params.put("my_token", token); 
       params.put("story_id", story_id); 

       return params; 
      } 

     }; 

     // Adding request to request queue 
     AppController.getInstance().addToRequestQueue(strReq, tag_string_req); 
    } 

} 

TimeLineActivity

public void getTimeLineData(final String token, final String page) { 


     String tag_string_req = "req_register"; 
     // making fresh volley request and getting json 
     StringRequest strReq = new StringRequest(Request.Method.POST, AppConfig.timeline, new Response.Listener<String>() { 

      @Override 
      public void onResponse(String response) { 
       VolleyLog.d(TAG, "Response: " + response.toString()); 
       if (response != null) { 
        try { 
         JSONObject jObj = new JSONObject(response); 
         boolean error = jObj.getBoolean("status"); 
         String message = jObj.getString("message"); 
         if (error) { 
          totalPages = jObj.getInt("totalPages"); 
          pageCount = jObj.getInt("page"); 

          int limit = jObj.getInt("limit"); 
          parseJsonFeed(response); 
         } 

        } catch (Exception e) { 

        } 

       } 
      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       VolleyLog.d(TAG, "Error: " + error.getMessage()); 
      } 
     }) { 

      @Override 
      protected Map<String, String> getParams() { 
       // Posting params to register url 
       Map<String, String> params = new HashMap<String, String>(); 
       params.put("my_token", token); 
       params.put("page", page); 
       params.put("limit", "5"); 

       return params; 
      } 
     }; 

     // Adding request to request queue 
     AppController.getInstance().addToRequestQueue(strReq, tag_string_req); 

    } 

    private void parseJsonFeed(String response) { 
     try { 
      JSONObject jsonObj = new JSONObject(response); 
      JSONArray feedArray = jsonObj.getJSONArray("data"); 

      for (int i = 0; i < feedArray.length(); i++) { 
       JSONObject feedObj = (JSONObject) feedArray.get(i); 

       TimeLineItem item = new TimeLineItem(); 
       item.setId(feedObj.getInt("id")); 
       item.setName(feedObj.getString("name")); 
       item.setLname(feedObj.getString("lname")); 

       // Image might be null sometimes 
       String image = feedObj.isNull("image") ? null : feedObj 
         .getString("image"); 

       if (image.equals("")) { 
        item.setImge(image); 
       } else { 
        item.setImge(AppConfig.storyPic + image); 
       } 

       item.setStatus(feedObj.getString("story_text")); 
       item.setProfilePic(AppConfig.profilePic + feedObj.getString("profile_pic")); 
       item.setTimeStamp(feedObj.getString("time_stamp")); 
       item.setIsLike(feedObj.getInt("is_like")); 
       item.setTotalLikes(feedObj.getString("total_likes")); 
       item.setTotalComment(feedObj.getString("total_comments")); 

       /*// url might be null sometimes 
       String feedUrl = feedObj.isNull("url") ? null : feedObj 
         .getString("url"); 
       item.setUrl(feedUrl);*/ 

       timeLineItems.add(item); 
      } 

      // notify data changes to list adapater 
      adapter.notifyDataSetChanged(); 


     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

private void addStory(final String story_text, final String token, final String image) { 
     // Tag used to cancel the request 
     String tag_string_req = "req_register"; 

     pDialog.setMessage("Please wait ..."); 
     showDialog(); 

     StringRequest strReq = new StringRequest(Request.Method.POST, AppConfig.addStory, new Response.Listener<String>() { 

      @Override 
      public void onResponse(String response) { 
       hideDialog(); 

       try { 
        JSONObject jObj = new JSONObject(response); 
        boolean error = jObj.getBoolean("status"); 
        message = jObj.getString("message"); 
        if (error) { 
         adapter.notifyDataSetChanged(); 
         txtStatusBox.setText(""); 
         imgImageUpload.setImageBitmap(null); 
         imgImageUpload.setBackgroundResource(R.drawable.image); 
         Toast.makeText(TimelineActivity.this, message, Toast.LENGTH_SHORT).show(); 
         slidingUpPanelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); 

        } else { 

         // Error occurred in registration. Get the error 
         // message 
         String errorMsg = jObj.getString("message"); 
         Toast.makeText(TimelineActivity.this, errorMsg, Toast.LENGTH_LONG).show(); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       Toast.makeText(TimelineActivity.this, "Oops something went wrong...", Toast.LENGTH_LONG).show(); 
       hideDialog(); 
      } 
     }) { 

      @Override 
      protected Map<String 
        , String> getParams() { 
       // Posting params to register url 
       Map<String, String> params = new HashMap<String, String>(); 
       params.put("my_token", token); 
       params.put("story_text", story_text); 
       params.put("image", image); 

       return params; 
      } 

     }; 

     // Adding request to request queue 
     AppController.getInstance().addToRequestQueue(strReq, tag_string_req); 
    } 

回答

1

您需要實現某種輪詢機制在服務器端做到這一點。有一個解決方法,但它不被認爲是好的做法。您可以使用Timer定期調用getTimeline函數來更新回收站視圖。像這樣的事情在你的onCreate:

Timer autoRefresh; 
autoRefresh=new Timer(); 
    autoRefresh.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       public void run() { 
        getTimeLineData(token, page); 
       } 
      }); 
     } 
    }, 0, your_time_in_milliseconds); 

您可以通過異步在Android中使用AsyncTask甚至做到這一點。

+0

感謝您的回覆Kavach。但是,當用戶向下滾動列表並立即列出刷新併到達頂部時,我認爲它看起來不太好。 –

+0

您可以使用recyclerView的'addOnScrollListener'來檢查用戶是否正在滾動並獲取其當前位置。那麼相應的,你可以把條件調用autoRefrest Timer或不。這會解決你的問題。 –

+0

否它沒有解決我的問題。 –

相關問題