public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;
    if (convertView == null) {
      holder = new ViewHolder();
      convertView = inflater.inflate(R.layout.list_row, null);
      holder.text = (TextView) convertView.findViewById(R.id.title); // title
      holder.text1 = (TextView) convertView.findViewById(R.id.duration); // duration
      holder.ly = (LinearLayout) convertView.findViewById(R.id.images);
      holder.btnRealTime = (ImageButton) convertView.findViewById(R.id.realTimeButton);
      holder.realTimeData = (TextView) convertView.findViewById(R.id.realTime); // duration
      holder.mProgressView = convertView.findViewById(R.id.loginProgress);
      convertView.setTag(holder);
    } else {
      holder = (ViewHolder) convertView.getTag();
    }
    holder.btnRealTime.setTag(position);
    holder.realTimeData.setTag(position);

    // Fetching position-th route
    final Route path = result.get(position);

    holder.text.setText(
        path.getDeparture().getTravelTime()
            + " - "
            + path.getArrival().getTravelTime()
            + " ("
            + path.getDuration().getTravelTime()
            + ")");
    holder.text1.setText(path.getDistance());

    holder.realTimeData.setHint(
        Html.fromHtml(
            "<small><small><small>" + "Click refresh for Real Time" + "</small></small></small>"));

    final View finalConvertView = convertView;

    /*
    on click listener for the Refresh Button to fetch actual bus arrival
    time from our application server
    */
    holder.btnRealTime.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            int pos = (Integer) v.getTag();
            Log.d(TAG, "pos: " + pos + " position: " + position);
            if (pos == position) {
              showProgress(true, holder.mProgressView, holder.realTimeData);

              AucklandPublicTransportAPI api =
                  new AucklandPublicTransportAPI(
                      activity.getApplicationContext(),
                      holder.realTimeData,
                      holder.mProgressView,
                      RoutesAdaptar.this);

              for (int i = 0; i < path.getSteps().size(); i++) {
                RouteStep routeStep = path.getSteps().get(i);

                /*
                Send a reference of the TextView to AucklandPublicTransportAPI class
                in order to strike the contents of this text view when the actual
                arrival time is fetched from server for the corresponding BUS of
                a given route, as this textview displays the static scheduled time.
                 */
                if (routeStep.getTransportName() == R.string.tr_bus) {
                  TextView textView = (TextView) finalConvertView.findViewById(i);

                  api.setTextView(textView);
                  api.getRealTimeDate(
                      routeStep.getStartLoc(),
                      routeStep.getShortName(),
                      routeStep.getDeparture().getSeconds());
                  break;
                } else if (routeStep.isTransit()) {
                  break;
                }
              }
            }
          }
        });

    if (path.getSteps() != null) {

      /*
      Only if the first public transport step involves the BUS route,
      make the real Time components visible to the user. Otherwise, hide
      these components as the real time transit data is available only for
      BUSES and not for any other transit vehicle.
       */
      if (path.showrealTime()) {
        holder.btnRealTime.setVisibility(View.VISIBLE);
        holder.realTimeData.setVisibility(View.VISIBLE);
      } else {
        holder.btnRealTime.setVisibility(View.GONE);
        holder.realTimeData.setVisibility(View.GONE);
      }
      holder.ly.removeAllViews();
      populateLinks(holder.ly, path.getSteps(), path, holder.realTimeData);
    }

    return convertView;
  }
  /**
   * Function used to ensure that the items of a given list row gets wrapped up and do not extend
   * the UI width and height
   */
  private void populateLinks(
      LinearLayout ll, ArrayList<RouteStep> collection, Route route, TextView realTimeText) {

    Display display = activity.getWindowManager().getDefaultDisplay();
    int maxWidth = display.getWidth() - 100;

    /*
    Only if route object contains steps array, allow wrap content
     */
    if (collection.size() > 0) {
      LinearLayout llAlso = new LinearLayout(activity.getApplicationContext());
      llAlso.setLayoutParams(
          new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
      llAlso.setOrientation(LinearLayout.HORIZONTAL);

      int widthSoFar = 0;
      for (int pos = 0; pos < collection.size(); pos++) {
        RouteStep samItem = collection.get(pos);

        TextView image = new TextView(activity.getApplicationContext());
        if (samItem.isTransit()) {
          image.setText(samItem.getDeparture().getTravelTime());

          /*
          Assign an ID to the textview so that when application
          gets the real time data, it can strike off the scheduled arrival time
           */
          image.setId(pos);

          /*
          If the route step is the BUS, check if its the first public transport
          step of the journey, then strike the scheduled bus arrival time
          with the actual arrival time of the BUS retrieved from our application
          server.
           */
          if (samItem.getTransportName() == R.string.tr_bus
              && (pos == 0 || (pos > 0 && !collection.get(pos - 1).isTransit()))
              && !TextUtils.isEmpty(realTimeText.getText())
              && realTimeText.getText().toString().compareTo("Not Available") != 0) {
            image.setPaintFlags(image.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
          }
        } else {
          /*
          Display the time when the user has to start this particular step
          of the journey.
           */
          if (pos == 0) {
            image.setText(route.getDeparture().getTravelTime());
          } else {
            RouteStep item = collection.get(pos - 1);
            image.setText(item.getArrival().getTravelTime());
          }

          // image = new ImageView(activity.getApplicationContext());
          // ((ImageView)image).setImageResource(samItem.getIconId());
          // image.measure(0, 0);
        }

        /*
        display an image corresponding to the mode of travel.
         */
        int id = samItem.getIconId();
        image.setCompoundDrawablesWithIntrinsicBounds(
            0, // left
            0, // top
            0, // right
            id); // bottom);
        image.setTextColor(Color.parseColor("#996633"));
        image.setTypeface(null, Typeface.BOLD);
        image.measure(0, 0);
        widthSoFar += image.getMeasuredWidth();

        /*
        if the components added so far has extended the UI width, wrap
        the contents of the corresponding list row
         */
        if (widthSoFar >= maxWidth) {
          ll.addView(llAlso);

          llAlso = new LinearLayout(activity.getApplicationContext());
          llAlso.setLayoutParams(
              new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
          llAlso.setOrientation(LinearLayout.HORIZONTAL);

          llAlso.addView(image);
          widthSoFar = image.getMeasuredWidth();
        } else {
          llAlso.addView(image);
        }

        /*
        Display the transit vehicle line number and check if
        the components added so far has not extended the UI width. If yes then wrap
        the contents of the corresponding list row
         */
        if (samItem.getShortName() != "" && !samItem.getShortName().equals("")) {
          TextView name = new TextView(activity.getApplicationContext());
          name.setText(samItem.getShortName());
          LinearLayout.LayoutParams params =
              new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
          params.setMargins(0, 50, 0, 0);
          name.setLayoutParams(params);
          name.setTextColor(Color.parseColor("#FFA500"));
          name.setTypeface(null, Typeface.BOLD);

          name.measure(0, 0);
          widthSoFar += name.getMeasuredWidth();

          if (widthSoFar >= maxWidth) {
            ll.addView(llAlso);

            llAlso = new LinearLayout(activity.getApplicationContext());
            llAlso.setLayoutParams(
                new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
            llAlso.setOrientation(LinearLayout.HORIZONTAL);

            llAlso.addView(name);
            widthSoFar = name.getMeasuredWidth();
          } else {
            llAlso.addView(name);
          }
        }
        if (pos < collection.size() - 1) {
          ImageView next = new ImageView(activity.getApplicationContext());
          next.setImageResource(R.drawable.ic_action_next_item);
          next.measure(0, 0);
          widthSoFar += next.getMeasuredWidth();

          if (widthSoFar >= maxWidth) {
            ll.addView(llAlso);

            llAlso = new LinearLayout(activity.getApplicationContext());
            llAlso.setLayoutParams(
                new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
            llAlso.setOrientation(LinearLayout.HORIZONTAL);

            llAlso.addView(next);
            widthSoFar = next.getMeasuredWidth();
          } else {
            llAlso.addView(next);
          }
        }
      }

      ll.addView(llAlso);
    }
  }