Skip to content

Commit 43a7760

Browse files
author
Ingo Schwarz
committed
Add SortingStatusChangeListener to the SortableTableView
1 parent 16da25b commit 43a7760

2 files changed

Lines changed: 63 additions & 18 deletions

File tree

tableview/src/main/java/de/codecrafters/tableview/SortableTableView.java

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@
77
import android.util.AttributeSet;
88
import android.util.Log;
99
import android.util.SparseArray;
10+
import de.codecrafters.tableview.listeners.SortingStatusChangeListener;
1011
import de.codecrafters.tableview.listeners.TableHeaderClickListener;
1112
import 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) {
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package de.codecrafters.tableview.listeners;
2+
3+
import de.codecrafters.tableview.SortingStatus;
4+
5+
/**
6+
* Definition of a listener that is notified when the {@link SortingStatus} has changed.
7+
*/
8+
public interface SortingStatusChangeListener {
9+
10+
/**
11+
* Callback method that is called when the {@link SortingStatus} has changed.
12+
*
13+
* @param newSortingStatus The new {@link SortingStatus}.
14+
*/
15+
void onSortingStatusChanged(final SortingStatus newSortingStatus);
16+
}

0 commit comments

Comments
 (0)