title: RecyclerView stutters when new view added
body: <p>I have a recycler view which is populated dynamically from an API. The recycler view item contains an imageview with text layered over the top of it, the images for the image view come from the API and are loaded in using Picasso. When scrolling the recyclerview I have found that when a new view is added to the bottom there is a slight stutter in the scroll. I have also found that the more i scroll, the slower and less responsive the scrolling gets. I have tried using it with the picasso code commented out and get the same results.</p>
  
  <p>Here is my adapter for the recyclerview:</p>
  
  <pre><code>public class EventListAdapter extends RecyclerView.Adapter&lt;EventListAdapter.ViewHolder&gt; {
  
  Context context;
  public ArrayList&lt;EventObject&gt; eventList;
  private LayoutInflater mInflater;
  private String category;
  
  public static class ViewHolder extends RecyclerView.ViewHolder {
      private ImageView img_main;
      private RelativeLayout layoutItem;
      private TextView txt_event_name;
      private TextView txt_event_details;
      private TextView txt_going_to;
  
      public ViewHolder(View itemView) {
          super(itemView);
          img_main = (ImageView) itemView.findViewById(R.id.img_main);
          txt_event_details = (TextView) itemView.findViewById(R.id.txt_event_details);
          txt_event_name = (TextView) itemView.findViewById(R.id.txt_event_name);
          txt_going_to = (TextView) itemView.findViewById(R.id.txt_going_to);
          gradient_view = itemView.findViewById(R.id.gradient_view);
          layoutItem = (RelativeLayout) itemView.findViewById(R.id.rl_event_item);
      }
  
      public void bindView(final Context context, final EventObject eventObject, String category) throws JSONException, ParseException {
          txt_event_name.setTypeface(FontClass.getOpenSansRegular(context));
          txt_event_details.setTypeface(FontClass.getOpenSansLight(context));
          txt_going_to.setTypeface(FontClass.getOpenSansLight(context));
  
          txt_event_name.setText(eventObject.getEventName());
  
          if (eventObject.getVenueName().contains(eventObject.getTown())) {
              txt_event_details.setText(eventObject.getVenueName() + ", " + getFormattedDate(eventObject.getEventDate()));
          } else {
              txt_event_details.setText(eventObject.getVenueName() + ", " + eventObject.getTown() + ", " + getFormattedDate(eventObject.getEventDate()));
          }
  
          if(eventObject.getFeeFreeStatus() == 1){
              if(category.equalsIgnoreCase("no fees")) {
                  txt_going_to.setVisibility(View.GONE);
              } else {
                  txt_going_to.setVisibility(View.VISIBLE);
                  txt_going_to.setText("Fee free tickets available");
              }
  
          } else if (Integer.parseInt(eventObject.getGoingToCount()) &gt;= 200) {
              txt_going_to.setVisibility(View.VISIBLE);
              txt_going_to.setText("Popular event: " + eventObject.getGoingToCount() + " going");
          } else {
              txt_going_to.setVisibility(View.GONE);
          }
  
  
          layoutItem.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  ((HomeActivity) context).setEventProfileFrag(eventObject.getFullJsonObject(), null);
              }
          });
  
          Picasso.with(context)
                  .load(eventObject.getImageUrl())
                  .placeholder(R.drawable.holder_image)
                  .into(img_main);
  
      }
  
      private String getFormattedDate(String dateString) throws ParseException {
  
          SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.UK);
          Date newDate = format.parse(dateString);
  
          format = new SimpleDateFormat("EEEE dd MMMM", Locale.UK);
          String date = format.format(newDate);
  
          return date;
      }
  
  }
  
  @Override
  public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_event_list_item, parent, false);
      return new ViewHolder(itemView);
  }
  
  @Override
  public void onBindViewHolder(final ViewHolder holder, int position) {
  
      try {
          holder.bindView(context, eventList.get(position), this.category);
      } catch (JSONException e) {
          e.printStackTrace();
      } catch (ParseException e) {
          e.printStackTrace();
      }
  }
  
  @Override
  public long getItemId(int position) {
      return position;
  }
  
  @Override
  public int getItemCount() {
      return eventList.size();
  }
  
  
  public EventListAdapter(Context context, ArrayList&lt;EventObject&gt; eventList, String category) {
      this.context = context;
      this.eventList = eventList;
      this.category = category;
      mInflater = LayoutInflater.from(context);
      setHasStableIds(true);
  }
  
  public void addItems(ArrayList&lt;EventObject&gt; eventList) {
      this.eventList.addAll(eventList);
      notifyDataSetChanged();
  }
  }
  </code></pre>