package cgeo.geocaching.address; import cgeo.geocaching.R; import cgeo.geocaching.location.Geopoint; import cgeo.geocaching.location.Units; import cgeo.geocaching.sensors.Sensors; import cgeo.geocaching.ui.recyclerview.AbstractRecyclerViewAdapter; import cgeo.geocaching.ui.recyclerview.AbstractRecyclerViewHolder; import android.location.Address; import android.support.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.TextView; import java.util.ArrayList; import java.util.List; import butterknife.BindView; import org.apache.commons.lang3.StringUtils; class AddressListAdapter extends AbstractRecyclerViewAdapter<AddressListAdapter.AddressListHolder> { @NonNull private final Geopoint location; @NonNull private final List<Address> addresses; @NonNull private final AddressClickListener clickListener; protected static final class AddressListHolder extends AbstractRecyclerViewHolder { @BindView(R.id.label) TextView label; @BindView(R.id.distance) TextView distance; AddressListHolder(final View itemView) { super(itemView); } } AddressListAdapter(@NonNull final List<Address> addresses, @NonNull final AddressClickListener addressClickListener) { this.addresses = addresses; this.clickListener = addressClickListener; location = Sensors.getInstance().currentGeo().getCoords(); } @Override public int getItemCount() { return addresses.size(); } @Override public AddressListHolder onCreateViewHolder(final ViewGroup parent, final int viewType) { final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.addresslist_item, parent, false); final AddressListHolder viewHolder = new AddressListHolder(view); viewHolder.itemView.setOnClickListener(new OnClickListener() { @Override public void onClick(final View view) { clickListener.onClickAddress(addresses.get(viewHolder.getItemPosition())); } }); return viewHolder; } @Override public void onBindViewHolder(final AddressListHolder holder, final int position) { super.onBindViewHolder(holder, position); final Address address = addresses.get(position); holder.label.setText(getAddressText(address)); holder.distance.setText(getDistanceText(address)); } private CharSequence getDistanceText(final Address address) { if (address.hasLatitude() && address.hasLongitude()) { return Units.getDistanceFromKilometers(location.distanceTo(new Geopoint(address.getLatitude(), address.getLongitude()))); } return ""; } private static CharSequence getAddressText(final Address address) { final int maxIndex = address.getMaxAddressLineIndex(); final List<String> lines = new ArrayList<>(); for (int i = 0; i <= maxIndex; i++) { final String line = address.getAddressLine(i); if (StringUtils.isNotBlank(line)) { lines.add(line); } } return StringUtils.join(lines, "\n"); } }