@Override
    protected FilterResults performFiltering(CharSequence constraint) {

      String filterString = constraint.toString().toLowerCase();

      FilterResults results = new FilterResults();

      final ArrayList<WeatherInfo> list = data;

      int count = list.size();
      final ArrayList<WeatherInfo> weatherInfos = new ArrayList<>(count);

      WeatherInfo filterableObject;

      for (int i = 0; i < count; i++) {
        filterableObject = list.get(i);
        if (filterableObject.getName().toLowerCase().contains(filterString)) {
          weatherInfos.add(filterableObject);
        }
      }

      results.values = weatherInfos;
      results.count = weatherInfos.size();
      return results;
    }
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    int layoutResourceId;

    WeatherInfo mWeatherInfo = filteredData.get(position);

    // if (convertView == null) {
    holder = new ViewHolder();

    layoutResourceId = R.layout.weather_row_default;
    LayoutInflater inflater = ((Activity) context).getLayoutInflater();
    convertView = inflater.inflate(layoutResourceId, parent, false);

    holder.isProtected = mWeatherInfo.isProtected();
    holder.name = (TextView) convertView.findViewById(R.id.weather_name);
    holder.iconRow = (ImageView) convertView.findViewById(R.id.rowIcon);
    holder.data = (TextView) convertView.findViewById(R.id.weather_data);
    holder.hardware = (TextView) convertView.findViewById(R.id.weather_hardware);
    holder.dayButton = (Button) convertView.findViewById(R.id.day_button);
    holder.monthButton = (Button) convertView.findViewById(R.id.month_button);
    holder.yearButton = (Button) convertView.findViewById(R.id.year_button);

    holder.name.setText(mWeatherInfo.getName());
    holder.hardware.append(mWeatherInfo.getHardwareName());

    holder.data.setEllipsize(TextUtils.TruncateAt.END);
    holder.data.setMaxLines(3);
    holder.data.append(mWeatherInfo.getData());

    if (!UsefulBits.isEmpty(mWeatherInfo.getRain()))
      holder.data.setText(context.getString(R.string.rain) + ": " + mWeatherInfo.getRain());
    if (!UsefulBits.isEmpty(mWeatherInfo.getRainRate()))
      holder.data.append(
          ", " + context.getString(R.string.rainrate) + ": " + mWeatherInfo.getRainRate());

    if (!UsefulBits.isEmpty(mWeatherInfo.getForecastStr()))
      holder.data.append(", " + mWeatherInfo.getForecastStr());
    if (!UsefulBits.isEmpty(mWeatherInfo.getSpeed()))
      holder.data.append(", " + context.getString(R.string.speed) + ": " + mWeatherInfo.getSpeed());
    if (mWeatherInfo.getDewPoint() > 0)
      holder.data.append(
          ", " + context.getString(R.string.dewPoint) + ": " + mWeatherInfo.getDewPoint());
    if (mWeatherInfo.getTemp() > 0)
      holder.data.append(", " + context.getString(R.string.temp) + ": " + mWeatherInfo.getTemp());
    if (mWeatherInfo.getBarometer() > 0)
      holder.data.append(
          ", " + context.getString(R.string.pressure) + ": " + mWeatherInfo.getBarometer());
    if (!UsefulBits.isEmpty(mWeatherInfo.getChill()))
      holder.data.append(", " + context.getString(R.string.chill) + ": " + mWeatherInfo.getChill());
    if (!UsefulBits.isEmpty(mWeatherInfo.getDirectionStr()))
      holder.data.append(
          ", " + context.getString(R.string.direction) + ": " + mWeatherInfo.getDirectionStr());
    if (!UsefulBits.isEmpty(mWeatherInfo.getHumidityStatus()))
      holder.data.append(
          ", " + context.getString(R.string.humidity) + ": " + mWeatherInfo.getHumidityStatus());

    holder.dayButton.setId(mWeatherInfo.getIdx());
    holder.dayButton.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            for (WeatherInfo t : filteredData) {
              if (t.getIdx() == v.getId()) listener.onLogClick(t, Domoticz.Graph.Range.DAY);
            }
          }
        });

    holder.monthButton.setId(mWeatherInfo.getIdx());
    holder.monthButton.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            for (WeatherInfo t : filteredData) {
              if (t.getIdx() == v.getId()) listener.onLogClick(t, Domoticz.Graph.Range.MONTH);
            }
          }
        });

    holder.yearButton.setId(mWeatherInfo.getIdx());
    holder.yearButton.setOnClickListener(
        new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            for (WeatherInfo t : filteredData) {
              if (t.getIdx() == v.getId()) listener.onLogClick(t, Domoticz.Graph.Range.YEAR);
            }
          }
        });

    convertView.setTag(holder);
    Picasso.with(context)
        .load(
            domoticz.getDrawableIcon(
                mWeatherInfo.getTypeImg(), mWeatherInfo.getType(), null, false, false, null))
        .into(holder.iconRow);
    return convertView;
  }