diff options
author | Alexander Zatsepin <az@mapswithme.com> | 2018-04-26 12:20:32 +0300 |
---|---|---|
committer | Roman Kuznetsov <r.kuznetsow@gmail.com> | 2018-04-26 14:43:08 +0300 |
commit | 485845c4cfcd241ba505bc31d96fa934277f276f (patch) | |
tree | 864fdcabbb2652cf106c25378b7758739fc86ef9 | |
parent | 45a629e3e579391a245a979166df7668188bb4e9 (diff) |
[andorid] Refactored bookmark list ui to recycler view
5 files changed, 335 insertions, 251 deletions
diff --git a/android/res/layout/fragment_bookmark_list.xml b/android/res/layout/fragment_bookmark_list.xml new file mode 100644 index 0000000000..4667abb269 --- /dev/null +++ b/android/res/layout/fragment_bookmark_list.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.v7.widget.RecyclerView + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/recycler" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:divider="@null"/> diff --git a/android/res/layout/simple_list.xml b/android/res/layout/simple_list.xml deleted file mode 100644 index 964b50ad8b..0000000000 --- a/android/res/layout/simple_list.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<ListView xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@android:id/list" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:divider="@null"/>
\ No newline at end of file diff --git a/android/src/com/mapswithme/maps/bookmarks/BookmarkListAdapter.java b/android/src/com/mapswithme/maps/bookmarks/BookmarkListAdapter.java index 328fda4773..c5510144c8 100644 --- a/android/src/com/mapswithme/maps/bookmarks/BookmarkListAdapter.java +++ b/android/src/com/mapswithme/maps/bookmarks/BookmarkListAdapter.java @@ -1,29 +1,25 @@ package com.mapswithme.maps.bookmarks; import android.app.Activity; -import android.graphics.drawable.Drawable; import android.location.Location; +import android.support.annotation.Nullable; +import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; -import android.view.View; import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; import android.widget.TextView; -import java.util.ArrayList; -import java.util.List; - import com.mapswithme.maps.R; -import com.mapswithme.maps.bookmarks.data.Bookmark; import com.mapswithme.maps.bookmarks.data.BookmarkManager; -import com.mapswithme.maps.bookmarks.data.DistanceAndAzimut; -import com.mapswithme.maps.bookmarks.data.Track; import com.mapswithme.maps.location.LocationHelper; import com.mapswithme.maps.location.LocationListener; -import com.mapswithme.util.Graphics; +import com.mapswithme.maps.widget.recycler.RecyclerClickListener; +import com.mapswithme.maps.widget.recycler.RecyclerLongClickListener; +import static com.mapswithme.maps.bookmarks.Holders.BaseBookmarkHolder.SECTION_BMKS; +import static com.mapswithme.maps.bookmarks.Holders.BaseBookmarkHolder.SECTION_TRACKS; +import static com.mapswithme.maps.bookmarks.Holders.BaseBookmarkHolder.getTracksSectionPosition; -public class BookmarkListAdapter extends BaseAdapter +public class BookmarkListAdapter extends RecyclerView.Adapter<Holders.BaseBookmarkHolder> { private final Activity mActivity; private final long mCategoryId; @@ -33,9 +29,6 @@ public class BookmarkListAdapter extends BaseAdapter static final int TYPE_BOOKMARK = 1; static final int TYPE_SECTION = 2; - private static final int SECTION_TRACKS = 0; - private static final int SECTION_BMKS = 1; - private final LocationListener mLocationListener = new LocationListener.Simple() { @Override @@ -45,12 +38,27 @@ public class BookmarkListAdapter extends BaseAdapter } }; - public BookmarkListAdapter(Activity activity, long catId) + @Nullable + private RecyclerLongClickListener mLongClickListener; + @Nullable + private RecyclerClickListener mClickListener; + + BookmarkListAdapter(Activity activity, long catId) { mActivity = activity; mCategoryId = catId; } + public void setOnClickListener(@Nullable RecyclerClickListener listener) + { + mClickListener = listener; + } + + void setOnLongClickListener(@Nullable RecyclerLongClickListener listener) + { + mLongClickListener = listener; + } + public void startLocationUpdate() { LocationHelper.INSTANCE.addListener(mLocationListener, true); @@ -62,78 +70,71 @@ public class BookmarkListAdapter extends BaseAdapter } @Override - public int getViewTypeCount() + public Holders.BaseBookmarkHolder onCreateViewHolder(ViewGroup parent, int viewType) { - return 3; // bookmark + track + section + LayoutInflater inflater = LayoutInflater.from(mActivity); + Holders.BaseBookmarkHolder holder = null; + switch (viewType) + { + case TYPE_TRACK: + holder = new Holders.TrackViewHolder(inflater.inflate(R.layout.item_track, + parent, false), mCategoryId); + break; + case TYPE_BOOKMARK: + holder = new Holders.BookmarkViewHolder(inflater.inflate(R.layout.item_bookmark, + parent,false), mCategoryId); + break; + case TYPE_SECTION: + holder = new Holders.SectionViewHolder((TextView) inflater.inflate(R.layout.item_category_title, + parent, false), mCategoryId); + break; + } + + if (holder == null) + throw new AssertionError("Unsupported view type: " + viewType); + + holder.setOnClickListener(mClickListener); + holder.setOnLongClickListener(mLongClickListener); + return holder; + } + + @Override + public void onBindViewHolder(Holders.BaseBookmarkHolder holder, int position) + { + holder.bind(position); } @Override public int getItemViewType(int position) { - final int bmkPos = getBookmarksSectionPosition(); - final int trackPos = getTracksSectionPosition(); + final int bmkPos = Holders.BaseBookmarkHolder.getBookmarksSectionPosition(mCategoryId); + final int trackPos = getTracksSectionPosition(mCategoryId); if (position == bmkPos || position == trackPos) return TYPE_SECTION; - if (position > bmkPos && !isSectionEmpty(SECTION_BMKS)) + if (position > bmkPos && !Holders.BaseBookmarkHolder.isSectionEmpty(mCategoryId, SECTION_BMKS)) return TYPE_BOOKMARK; - else if (position > trackPos && !isSectionEmpty(SECTION_TRACKS)) + else if (position > trackPos && !Holders.BaseBookmarkHolder.isSectionEmpty(mCategoryId, SECTION_TRACKS)) return TYPE_TRACK; throw new IllegalArgumentException("Position not found: " + position); } @Override - public boolean isEnabled(int position) - { - return getItemViewType(position) != TYPE_SECTION; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) + public long getItemId(int position) { - final int type = getItemViewType(position); - - if (type == TYPE_SECTION) - { - TextView sectionView; - - if (convertView == null) - sectionView = (TextView) LayoutInflater.from(mActivity).inflate(R.layout.item_category_title, parent, false); - else - sectionView = (TextView) convertView; - - final int sectionIndex = getSectionForPosition(position); - sectionView.setText(getSections().get(sectionIndex)); - return sectionView; - } - - if (convertView == null) - { - final int id = (type == TYPE_BOOKMARK) ? R.layout.item_bookmark : R.layout.item_track; - convertView = LayoutInflater.from(mActivity).inflate(id, parent, false); - convertView.setTag(new PinHolder(convertView)); - } - - final PinHolder holder = (PinHolder) convertView.getTag(); - if (type == TYPE_BOOKMARK) - holder.set((Bookmark) getItem(position)); - else - holder.set((Track) getItem(position)); - - return convertView; + return position; } @Override - public int getCount() + public int getItemCount() { return BookmarkManager.INSTANCE.getCategorySize(mCategoryId) - + (isSectionEmpty(SECTION_TRACKS) ? 0 : 1) - + (isSectionEmpty(SECTION_BMKS) ? 0 : 1); + + (Holders.BaseBookmarkHolder.isSectionEmpty(mCategoryId, SECTION_TRACKS) ? 0 : 1) + + (Holders.BaseBookmarkHolder.isSectionEmpty(mCategoryId, SECTION_BMKS) ? 0 : 1); } - @Override public Object getItem(int position) { if (getItemViewType(position) == TYPE_TRACK) @@ -144,126 +145,11 @@ public class BookmarkListAdapter extends BaseAdapter else { final int pos = position - 1 - - (isSectionEmpty(SECTION_TRACKS) ? 0 : BookmarkManager.INSTANCE.getTracksCount(mCategoryId) + 1); + - (Holders.BaseBookmarkHolder.isSectionEmpty(mCategoryId, SECTION_TRACKS) + ? 0 : BookmarkManager.INSTANCE.getTracksCount(mCategoryId) + 1); final long bookmarkId = BookmarkManager.INSTANCE.getBookmarkIdByPosition(mCategoryId, pos); return BookmarkManager.INSTANCE.getBookmark(bookmarkId); } } - @Override - public long getItemId(int position) - { - return position; - } - - private class PinHolder - { - ImageView icon; - TextView name; - TextView distance; - - public PinHolder(View convertView) - { - icon = (ImageView) convertView.findViewById(R.id.iv__bookmark_color); - name = (TextView) convertView.findViewById(R.id.tv__bookmark_name); - distance = (TextView) convertView.findViewById(R.id.tv__bookmark_distance); - } - - void setName(Bookmark bmk) - { - name.setText(bmk.getTitle()); - } - - void setName(Track trk) - { - name.setText(trk.getName()); - } - - void setDistance(Bookmark bmk) - { - final Location loc = LocationHelper.INSTANCE.getSavedLocation(); - if (loc != null) - { - final DistanceAndAzimut daa = bmk.getDistanceAndAzimuth(loc.getLatitude(), loc.getLongitude(), 0.0); - distance.setText(daa.getDistance()); - } - else - distance.setText(null); - } - - void setDistance(Track trk) - { - distance.setText(mActivity.getString(R.string.length) + " " + trk.getLengthString()); - } - - void setIcon(Bookmark bookmark) - { - icon.setImageResource(bookmark.getIcon().getSelectedResId()); - } - - void setIcon(Track trk) - { - final Drawable circle = Graphics.drawCircle(trk.getColor(), R.dimen.track_circle_size, mActivity.getResources()); - icon.setImageDrawable(circle); - } - - void set(Bookmark bmk) - { - setName(bmk); - setDistance(bmk); - setIcon(bmk); - } - - void set(Track track) - { - setName(track); - setDistance(track); - setIcon(track); - } - } - - private int getTracksSectionPosition() - { - if (isSectionEmpty(SECTION_TRACKS)) - return -1; - - return 0; - } - - private int getBookmarksSectionPosition() - { - if (isSectionEmpty(SECTION_BMKS)) - return -1; - - return BookmarkManager.INSTANCE.getTracksCount(mCategoryId) - + (isSectionEmpty(SECTION_TRACKS) ? 0 : 1); - } - - private List<String> getSections() - { - final List<String> sections = new ArrayList<>(); - sections.add(mActivity.getString(R.string.tracks)); - sections.add(mActivity.getString(R.string.bookmarks)); - return sections; - } - - private int getSectionForPosition(int position) - { - if (position == getTracksSectionPosition()) - return SECTION_TRACKS; - if (position == getBookmarksSectionPosition()) - return SECTION_BMKS; - - throw new IllegalArgumentException("There is no section in position " + position); - } - - private boolean isSectionEmpty(int section) - { - if (section == SECTION_TRACKS) - return BookmarkManager.INSTANCE.getTracksCount(mCategoryId) == 0; - if (section == SECTION_BMKS) - return BookmarkManager.INSTANCE.getBookmarksCount(mCategoryId) == 0; - - throw new IllegalArgumentException("There is no section with index " + section); - } } diff --git a/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java b/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java index db43f02c99..c53001150d 100644 --- a/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java +++ b/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java @@ -7,40 +7,39 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.ListView; import com.mapswithme.maps.MwmActivity; import com.mapswithme.maps.R; -import com.mapswithme.maps.base.BaseMwmListFragment; +import com.mapswithme.maps.base.BaseMwmRecyclerFragment; import com.mapswithme.maps.bookmarks.data.Bookmark; import com.mapswithme.maps.bookmarks.data.BookmarkManager; import com.mapswithme.maps.bookmarks.data.BookmarkSharingResult; import com.mapswithme.maps.bookmarks.data.Track; import com.mapswithme.maps.widget.placepage.EditBookmarkFragment; import com.mapswithme.maps.widget.placepage.Sponsored; +import com.mapswithme.maps.widget.recycler.RecyclerClickListener; +import com.mapswithme.maps.widget.recycler.RecyclerLongClickListener; import com.mapswithme.util.BottomSheetHelper; import com.mapswithme.util.sharing.ShareOption; import com.mapswithme.util.sharing.SharingHelper; -public class BookmarksListFragment extends BaseMwmListFragment - implements AdapterView.OnItemLongClickListener, - MenuItem.OnMenuItemClickListener, - BookmarkManager.BookmarksSharingListener +public class BookmarksListFragment extends BaseMwmRecyclerFragment + implements RecyclerLongClickListener, RecyclerClickListener, + MenuItem.OnMenuItemClickListener, + BookmarkManager.BookmarksSharingListener { public static final String TAG = BookmarksListFragment.class.getSimpleName(); private int mCategoryPosition; private long mCategoryId; private int mSelectedPosition; - @Nullable - private BookmarkListAdapter mAdapter; @CallSuper @Override @@ -52,9 +51,15 @@ public class BookmarksListFragment extends BaseMwmListFragment } @Override + protected RecyclerView.Adapter createAdapter() + { + return new BookmarkListAdapter(getActivity(), mCategoryId); + } + + @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.simple_list, container, false); + return inflater.inflate(R.layout.fragment_bookmark_list, container, false); } @CallSuper @@ -80,11 +85,12 @@ public class BookmarksListFragment extends BaseMwmListFragment public void onResume() { super.onResume(); - if (mAdapter == null) + BookmarkListAdapter adapter = (BookmarkListAdapter) getAdapter(); + if (adapter == null) return; - mAdapter.startLocationUpdate(); - mAdapter.notifyDataSetChanged(); + adapter.startLocationUpdate(); + adapter.notifyDataSetChanged(); } @Override @@ -92,8 +98,9 @@ public class BookmarksListFragment extends BaseMwmListFragment { super.onPause(); - if (mAdapter != null) - mAdapter.stopLocationUpdate(); + BookmarkListAdapter adapter = (BookmarkListAdapter) getAdapter(); + if (adapter != null) + adapter.stopLocationUpdate(); } @Override @@ -105,30 +112,35 @@ public class BookmarksListFragment extends BaseMwmListFragment private void initList() { - mAdapter = new BookmarkListAdapter(getActivity(), mCategoryId); - mAdapter.startLocationUpdate(); - setListAdapter(mAdapter); - getListView().setOnItemLongClickListener(this); + BookmarkListAdapter adapter = (BookmarkListAdapter) getAdapter(); + if (adapter != null) + { + adapter.startLocationUpdate(); + adapter.setOnClickListener(this); + adapter.setOnLongClickListener(this); + } } @Override - public void onListItemClick(ListView l, View v, int position, long id) + public void onItemClick(View v, int position) { final Intent i = new Intent(getActivity(), MwmActivity.class); - if (mAdapter != null) + BookmarkListAdapter adapter = (BookmarkListAdapter) getAdapter(); + + if (adapter != null) { - switch (mAdapter.getItemViewType(position)) + switch (adapter.getItemViewType(position)) { case BookmarkListAdapter.TYPE_SECTION: return; case BookmarkListAdapter.TYPE_BOOKMARK: - final Bookmark bookmark = (Bookmark) mAdapter.getItem(position); + final Bookmark bookmark = (Bookmark) adapter.getItem(position); i.putExtra(MwmActivity.EXTRA_TASK, new MwmActivity.ShowBookmarkTask(bookmark.getCategoryId(), bookmark.getBookmarkId())); break; case BookmarkListAdapter.TYPE_TRACK: - final Track track = (Track) mAdapter.getItem(position); + final Track track = (Track) adapter.getItem(position); i.putExtra(MwmActivity.EXTRA_TASK, new MwmActivity.ShowTrackTask(track.getCategoryId(), track.getTrackId())); break; @@ -140,53 +152,53 @@ public class BookmarksListFragment extends BaseMwmListFragment } @Override - public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) + public void onLongItemClick(View v, int position) { - if (mAdapter == null) - return false; + BookmarkListAdapter adapter = (BookmarkListAdapter) getAdapter(); + if (adapter == null) + return; mSelectedPosition = position; - final Object item = mAdapter.getItem(mSelectedPosition); - int type = mAdapter.getItemViewType(mSelectedPosition); + final Object item = adapter.getItem(mSelectedPosition); + int type = adapter.getItemViewType(mSelectedPosition); switch (type) { - case BookmarkListAdapter.TYPE_SECTION: - // Do nothing here? - break; - - case BookmarkListAdapter.TYPE_BOOKMARK: - BottomSheetHelper.Builder bs = BottomSheetHelper.create(getActivity(), ((Bookmark) item).getTitle()) - .sheet(R.menu.menu_bookmarks) - .listener(this); - if (!ShareOption.SMS.isSupported(getActivity())) - bs.getMenu().removeItem(R.id.share_message); - - if (!ShareOption.EMAIL.isSupported(getActivity())) - bs.getMenu().removeItem(R.id.share_email); - - bs.tint().show(); - break; - - case BookmarkListAdapter.TYPE_TRACK: - BottomSheetHelper.create(getActivity(), ((Track) item).getName()) - .sheet(Menu.NONE, R.drawable.ic_delete, R.string.delete) - .listener(new MenuItem.OnMenuItemClickListener() - { - @Override - public boolean onMenuItemClick(MenuItem menuItem) + case BookmarkListAdapter.TYPE_SECTION: + // Do nothing here? + break; + + case BookmarkListAdapter.TYPE_BOOKMARK: + BottomSheetHelper.Builder bs = BottomSheetHelper.create(getActivity(), ((Bookmark) item).getTitle()) + .sheet(R.menu.menu_bookmarks) + .listener(this); + if (!ShareOption.SMS.isSupported(getActivity())) + bs.getMenu().removeItem(R.id.share_message); + + if (!ShareOption.EMAIL.isSupported(getActivity())) + bs.getMenu().removeItem(R.id.share_email); + + bs.tint().show(); + break; + + case BookmarkListAdapter.TYPE_TRACK: + BottomSheetHelper.create(getActivity(), ((Track) item).getName()) + .sheet(Menu.NONE, R.drawable.ic_delete, R.string.delete) + .listener(new MenuItem.OnMenuItemClickListener() { - BookmarkManager.INSTANCE.deleteTrack(((Track) item).getTrackId()); - mAdapter.notifyDataSetChanged(); - return false; - } - }).tint().show(); - break; + @Override + public boolean onMenuItemClick(MenuItem menuItem) + { + BookmarkManager.INSTANCE.deleteTrack(((Track) item).getTrackId()); + adapter.notifyDataSetChanged(); + return false; + } + }).tint().show(); + break; } - - return true; } + @Override public void onPreparedFileForSharing(@NonNull BookmarkSharingResult result) { @@ -196,10 +208,11 @@ public class BookmarksListFragment extends BaseMwmListFragment @Override public boolean onMenuItemClick(MenuItem menuItem) { - if (mAdapter == null) + BookmarkListAdapter adapter = (BookmarkListAdapter) getAdapter(); + if (adapter == null) return false; - Bookmark item = (Bookmark) mAdapter.getItem(mSelectedPosition); + Bookmark item = (Bookmark) adapter.getItem(mSelectedPosition); switch (menuItem.getItemId()) { @@ -222,14 +235,14 @@ public class BookmarksListFragment extends BaseMwmListFragment @Override public void onBookmarkSaved(long bookmarkId) { - mAdapter.notifyDataSetChanged(); + adapter.notifyDataSetChanged(); } }); break; case R.id.delete: BookmarkManager.INSTANCE.deleteBookmark(item.getBookmarkId()); - mAdapter.notifyDataSetChanged(); + adapter.notifyDataSetChanged(); break; } return false; diff --git a/android/src/com/mapswithme/maps/bookmarks/Holders.java b/android/src/com/mapswithme/maps/bookmarks/Holders.java index e32e126d93..f9495c1369 100644 --- a/android/src/com/mapswithme/maps/bookmarks/Holders.java +++ b/android/src/com/mapswithme/maps/bookmarks/Holders.java @@ -1,15 +1,29 @@ package com.mapswithme.maps.bookmarks; +import android.graphics.drawable.Drawable; +import android.location.Location; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.CheckBox; +import android.widget.ImageView; import android.widget.TextView; import com.mapswithme.maps.R; +import com.mapswithme.maps.bookmarks.data.Bookmark; +import com.mapswithme.maps.bookmarks.data.BookmarkManager; +import com.mapswithme.maps.bookmarks.data.DistanceAndAzimut; +import com.mapswithme.maps.bookmarks.data.Track; +import com.mapswithme.maps.location.LocationHelper; +import com.mapswithme.maps.widget.recycler.RecyclerClickListener; +import com.mapswithme.maps.widget.recycler.RecyclerLongClickListener; +import com.mapswithme.util.Graphics; import com.mapswithme.util.UiUtils; +import java.util.ArrayList; +import java.util.List; + public class Holders { static class GeneralViewHolder extends RecyclerView.ViewHolder @@ -104,4 +118,174 @@ public class Holders mSize.setText(mSize.getResources().getQuantityString(R.plurals.bookmarks_places, size, size)); } } + + static abstract class BaseBookmarkHolder extends RecyclerView.ViewHolder + { + static final int SECTION_TRACKS = 0; + static final int SECTION_BMKS = 1; + final long mCategoryId; + @NonNull + private final View mView; + + BaseBookmarkHolder(@NonNull View itemView, long categoryId) + { + super(itemView); + mCategoryId = categoryId; + mView = itemView; + } + + abstract void bind(int position); + + static boolean isSectionEmpty(long categoryId, int section) + { + if (section == SECTION_TRACKS) + return BookmarkManager.INSTANCE.getTracksCount(categoryId) == 0; + if (section == SECTION_BMKS) + return BookmarkManager.INSTANCE.getBookmarksCount(categoryId) == 0; + + throw new IllegalArgumentException("There is no section with index " + section); + } + + static int getSectionForPosition(long categoryId, int position) + { + if (position == getTracksSectionPosition(categoryId)) + return SECTION_TRACKS; + if (position == getBookmarksSectionPosition(categoryId)) + return SECTION_BMKS; + + throw new IllegalArgumentException("There is no section in position " + position); + } + + static int getTracksSectionPosition(long categoryId) + { + if (isSectionEmpty(categoryId, SECTION_TRACKS)) + return -1; + + return 0; + } + + static int getBookmarksSectionPosition(long categoryId) + { + if (isSectionEmpty(categoryId, SECTION_BMKS)) + return -1; + + return BookmarkManager.INSTANCE.getTracksCount(categoryId) + + (isSectionEmpty(categoryId, SECTION_TRACKS) ? 0 : 1); + } + + void setOnClickListener(@Nullable RecyclerClickListener listener) + { + mView.setOnClickListener(v -> { + if (listener != null) + listener.onItemClick(v, getAdapterPosition()); + }); + } + + void setOnLongClickListener(@Nullable RecyclerLongClickListener listener) + { + mView.setOnLongClickListener(v -> { + if (listener != null) + listener.onLongItemClick(v, getAdapterPosition()); + return true; + }); + } + } + + static class BookmarkViewHolder extends BaseBookmarkHolder + { + @NonNull + private final ImageView mIcon; + @NonNull + private final TextView mName; + @NonNull + private final TextView mDistance; + + BookmarkViewHolder(@NonNull View itemView, long categoryId) + { + super(itemView, categoryId); + mIcon = itemView.findViewById(R.id.iv__bookmark_color); + mName = itemView.findViewById(R.id.tv__bookmark_name); + mDistance = itemView.findViewById(R.id.tv__bookmark_distance); + } + + @Override + void bind(int position) + { + int pos = position - 1 - (isSectionEmpty(mCategoryId, SECTION_TRACKS) + ? 0 : BookmarkManager.INSTANCE.getTracksCount(mCategoryId) + 1); + final long bookmarkId = BookmarkManager.INSTANCE.getBookmarkIdByPosition(mCategoryId, pos); + Bookmark bookmark = BookmarkManager.INSTANCE.getBookmark(bookmarkId); + mName.setText(bookmark.getTitle()); + final Location loc = LocationHelper.INSTANCE.getSavedLocation(); + if (loc != null) + { + final DistanceAndAzimut daa = bookmark.getDistanceAndAzimuth(loc.getLatitude(), + loc.getLongitude(), 0.0); + mDistance.setText(daa.getDistance()); + } + else + mDistance.setText(null); + mIcon.setImageResource(bookmark.getIcon().getSelectedResId()); + } + } + + static class TrackViewHolder extends BaseBookmarkHolder + { + @NonNull + private final ImageView mIcon; + @NonNull + private final TextView mName; + @NonNull + private final TextView mDistance; + + TrackViewHolder(@NonNull View itemView, long categoryId) + { + super(itemView, categoryId); + mIcon = itemView.findViewById(R.id.iv__bookmark_color); + mName = itemView.findViewById(R.id.tv__bookmark_name); + mDistance = itemView.findViewById(R.id.tv__bookmark_distance); + } + + @Override + void bind(int position) + { + final long trackId = BookmarkManager.INSTANCE.getTrackIdByPosition(mCategoryId, + position - 1); + Track track = BookmarkManager.INSTANCE.getTrack(trackId); + mName.setText(track.getName()); + mDistance.setText(mDistance.getContext().getString(R.string.length) + + " " + track.getLengthString()); + Drawable circle = Graphics.drawCircle(track.getColor(), R.dimen.track_circle_size, + mIcon.getContext().getResources()); + mIcon.setImageDrawable(circle); + } + } + + static class SectionViewHolder extends BaseBookmarkHolder + { + @NonNull + private final TextView mView; + + SectionViewHolder(@NonNull TextView itemView, long categoryId) + { + super(itemView, categoryId); + mView = itemView; + } + + @Override + void bind(int position) + { + final int sectionIndex = getSectionForPosition(mCategoryId, position); + mView.setText(getSections().get(sectionIndex)); + mView.setText(getSections().get(sectionIndex)); + } + + private List<String> getSections() + { + final List<String> sections = new ArrayList<>(); + sections.add(mView.getContext().getString(R.string.tracks)); + sections.add(mView.getContext().getString(R.string.bookmarks)); + return sections; + } + } } |