77import android .util .AttributeSet ;
88import android .util .Log ;
99import android .util .SparseArray ;
10+ import de .codecrafters .tableview .listeners .SortingStatusChangeListener ;
1011import de .codecrafters .tableview .listeners .TableHeaderClickListener ;
1112import de .codecrafters .tableview .providers .SortStateViewProvider ;
1213
13- import java .util .Collections ;
14- import java .util .Comparator ;
15- import java .util .List ;
14+ import java .util .*;
1615
1716/**
1817 * Extension of the {@link TableView} that gives the possibility to sort the table by every single
@@ -170,6 +169,26 @@ public SortingStatus getSortingStatus() {
170169 return sortingController .sortingStatus ;
171170 }
172171
172+ /**
173+ * Adds the given {@link SortingStatusChangeListener} to this {@link SortableTableView}.
174+ *
175+ * @param listener The {@link SortingStatusChangeListener} that shall be added to this {@link SortableTableView}.
176+ * @return A boolean indicating if the adding of the {@link SortingStatusChangeListener} has been successful.
177+ */
178+ public boolean addSortingStatusChangedListener (final SortingStatusChangeListener listener ) {
179+ return sortingController .sortingStatusListeners .add (listener );
180+ }
181+
182+ /**
183+ * Removes the given {@link SortingStatusChangeListener} from this {@link SortableTableView}.
184+ *
185+ * @param listener The {@link SortingStatusChangeListener} that shall be removed from this {@link SortableTableView}.
186+ * @return A boolean indicating if the removal of the {@link SortingStatusChangeListener} has been successful.
187+ */
188+ public boolean removeSortingStatusChangedListener (final SortingStatusChangeListener listener ) {
189+ return sortingController .sortingStatusListeners .remove (listener );
190+ }
191+
173192 /**
174193 * Sorts the table using the given {@link Comparator}.
175194 *
@@ -210,6 +229,7 @@ protected void onRestoreInstanceState(final Parcelable state) {
210229 */
211230 private class SortingController implements TableHeaderClickListener {
212231
232+ private final Set <SortingStatusChangeListener > sortingStatusListeners = new HashSet <>();
213233 private final SparseArray <Comparator <T >> comparators = new SparseArray <>();
214234 private final SortingStatus sortingStatus = new SortingStatus ();
215235
@@ -222,11 +242,29 @@ public void onHeaderClicked(final int columnIndex) {
222242 return ;
223243 }
224244
225- sortedColumnComparator = getComparator (columnIndex );
245+ final SortingOrder sortingOrder = getSortingOrder (columnIndex );
246+ sortedColumnComparator = getComparator (columnIndex , sortingOrder );
247+
248+ sortingStatus .setSortedColumnIndex (columnIndex );
249+ sortingStatus .setSortedOrder (sortingOrder );
250+
226251 sortDataSFCT (sortedColumnComparator );
227252 setSortView (columnIndex );
228253
229- sortingStatus .setSortedColumnIndex (columnIndex );
254+ notifySortingStatusListeners ();
255+ }
256+
257+ private void notifySortingStatusListeners () {
258+ for (final SortingStatusChangeListener sortingStatusListener : sortingStatusListeners ) {
259+ sortingStatusListener .onSortingStatusChanged (sortingStatus );
260+ }
261+ }
262+
263+ private SortingOrder getSortingOrder (int columnIndex ) {
264+ if (sortingStatus .getSortedColumnIndex () == columnIndex && sortingStatus .getSortedOrder () == SortingOrder .ASCENDING ) {
265+ return SortingOrder .DESCENDING ;
266+ }
267+ return SortingOrder .ASCENDING ;
230268 }
231269
232270 public void sort (final int columnIndex , final SortingOrder sortingOrder ) {
@@ -273,23 +311,14 @@ private Comparator<T> getRawComparator(final int columnIndex) {
273311 return comparators .get (columnIndex );
274312 }
275313
276- private Comparator <T > getComparator (final int columnIndex ) {
314+ private Comparator <T > getComparator (final int columnIndex , final SortingOrder sortingOrder ) {
277315 final Comparator <T > columnComparator = comparators .get (columnIndex );
278316
279- final Comparator <T > comparator ;
280- if (sortingStatus .getSortedColumnIndex () == columnIndex ) {
281- if (sortingStatus .getSortedOrder () == SortingOrder .ASCENDING ) {
282- comparator = Collections .reverseOrder (columnComparator );
283- sortingStatus .setSortedOrder (SortingOrder .DESCENDING );
284- } else {
285- comparator = columnComparator ;
286- sortingStatus .setSortedOrder (SortingOrder .ASCENDING );
287- }
317+ if (sortingOrder == SortingOrder .ASCENDING ) {
318+ return columnComparator ;
288319 } else {
289- comparator = columnComparator ;
290- sortingStatus .setSortedOrder (SortingOrder .ASCENDING );
320+ return Collections .reverseOrder (columnComparator );
291321 }
292- return comparator ;
293322 }
294323
295324 public void setComparator (final int columnIndex , final Comparator <T > columnComparator ) {
0 commit comments