मैं सोच रहा हूं कि ऑब्जर्वेबल लिस्ट ऑब्जेक्ट के लिए कई फिल्टर लगाने का सबसे अच्छा कार्यान्वयन क्या है।
मेरे पास निम्नलिखित वस्तुएं हैं:
ComboBox<स्ट्रिंग> cbYear
टेक्स्टफ़ील्ड tfSearch
ऑब्जर्वेबल लिस्ट <ऑर्डरइटम> डेटा।
मुझे cbYear के मान और tfSearch के मान के आधार पर डेटा सूची को फ़िल्टर करने की आवश्यकता है।
यहाँ मैंने आवश्यकता को प्राप्त करने के लिए क्या किया है, लेकिन मुझे आश्चर्य है कि क्या कोई आसान तरीका है ...
private void initializeFilterTable() {
FilteredList<OrderItem> dataFiltered = new FilteredList<>(data, p -> true);
tfSearch.textProperty().addListener((obs, oldVal, newVal) -> {
String year = cbYear.getSelectionModel().getSelectedItem();
Predicate<OrderItem> filter = filters(newVal, year);
dataFiltered.setPredicate(filter);
});
cbYear.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> {
Predicate<OrderItem> filter = filters(tfSearch.getText(), newVal);
dataFiltered.setPredicate(filter);
});
SortedList<OrderItem> dataSorted = new SortedList<>(dataFiltered);
dataSorted.comparatorProperty().bind(table.comparatorProperty());
table.setItems(dataSorted);
}
private Predicate<OrderItem> filters(String search, String year) {
String lower = search.trim().toLowerCase();
Predicate<OrderItem> searchFilter = order -> {
if (lower == null || lower.isEmpty())
return true;
if (order.getCustomerName().toLowerCase().contains(lower))
return true;
else if (order.getOrderNumber().toLowerCase().contains(lower))
return true;
else if (order.getPDA_TypeStr().toLowerCase().contains(lower))
return true;
else if (order.getCount4UStr().toLowerCase().contains(lower))
return true;
else if (order.getCity().toLowerCase().contains(lower))
return true;
else if (order.getContactName().toLowerCase().contains(lower))
return true;
else if (order.getSoftware().toLowerCase().contains(lower))
return true;
else if (order.getPDA_Type() == 2 && "אנדרואיד".contains(lower))
return true;
else if (order.getStatusStr().toLowerCase().contains(lower))
return true;
return false;
};
Predicate<OrderItem> yearFilter = order -> {
if (year.equals("הכל"))
return true;
else if (year.equals(String.valueOf(order.getYear())))
return true;
return false;
};
return searchFilter.and(yearFilter);
}
1 उत्तर
आप फ़िल्टर की गई सूची को फ़िल्टर कर सकते हैं। यह तर्क के दो टुकड़ों को अलग रखता है।
FilteredList<OrderItem> filteredByText = new FilteredList<>(data, p -> true);
FilteredList<OrderItem> filteredByYear = new FilteredList<>(filteredByText, p -> true);
tfSearch.textProperty().addListener((obs, oldVal, newVal) -> filteredByText.setPredicate(p -> {
String lower = newVal.trim().toLowerCase();
if (lower == null || lower.isEmpty())
return true;
if (order.getCustomerName().toLowerCase().contains(lower))
return true;
else if (order.getOrderNumber().toLowerCase().contains(lower))
return true;
else if (order.getPDA_TypeStr().toLowerCase().contains(lower))
return true;
else if (order.getCount4UStr().toLowerCase().contains(lower))
return true;
else if (order.getCity().toLowerCase().contains(lower))
return true;
else if (order.getContactName().toLowerCase().contains(lower))
return true;
else if (order.getSoftware().toLowerCase().contains(lower))
return true;
else if (order.getPDA_Type() == 2 && "אנדרואיד".contains(lower))
return true;
else if (order.getStatusStr().toLowerCase().contains(lower))
return true;
return false;
}));
cbYear.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, year) -> filteredByYear.setPredicate(p -> {
if (year.equals("הכל"))
return true;
else if (year.equals(String.valueOf(order.getYear())))
return true;
return false;
}));
SortedList<OrderItem> dataSorted = new SortedList<>(filteredByYear);
dataSorted.comparatorProperty().bind(table.comparatorProperty());
table.setItems(dataSorted);
संबंधित सवाल
नए सवाल
java
जावा एक उच्च स्तरीय प्रोग्रामिंग भाषा है। इस टैग का उपयोग तब करें जब आपको भाषा का उपयोग करने या समझने में समस्या हो। इस टैग का उपयोग शायद ही कभी किया जाता है और इसका उपयोग अक्सर [वसंत], [वसंत-बूट], [जकार्ता-ई], [Android], [javafx], [हडूप], [श्रेणी] और [मावेन] के साथ किया जाता है।