如何按特定顺序对 CharmListView 进行排序?

问题描述

是否可以按特定顺序对 CharmlistView 进行排序?

该列表包含范围内的 BLE 蓝牙设备的名称。如何按以下方式进行排序? :

如果设备包含字符串:1-,则该设备属于Category XYZ; 如果字符串包含:2-,则该设备属于Category XXX。等等...

显示 CharmlistView 时,我们应该首先看到 Category XYZ ,然后是 Category ABC

CharmListView example 中,使用以下代码片段进行排序:

    if(ascending){
        charmlistView.setHeaderComparator((d1,d2) -> d1.compareto(d2));
        charmlistView.setComparator((s1,s2) -> Double.compare(s1.getDensity(),s2.getDensity()));
        ascending = false;
    } else {
        charmlistView.setHeaderComparator((d1,d2) -> d2.compareto(d1));
        charmlistView.setComparator((s1,s2) -> Double.compare(s2.getDensity(),s1.getDensity()));
        ascending = true;
    }

我不明白 charmlistView.setHeaderComparator((d1,d2) -> d2.compareto(d1));CharmlistView.setComparator((s1,s1.getDensity())); 正在工作。

认情况下,标题按自然顺序(按字母顺序)排序。如何不按字母顺序排序,而只按我提供的特定顺序排序?

Category XYZ should be on top

Category XYZ 应该在最上面

这是创建 CharmlistView 的类的源代码

package com.hacare.views;

import com.gluonhq.attach.ble.BleDevice;


import com.gluonhq.attach.ble.BleService;
import com.gluonhq.charm.glisten.application.MobileApplication;
import com.gluonhq.charm.glisten.control.AppBar;
import com.gluonhq.charm.glisten.control.CharmlistCell;
import com.gluonhq.charm.glisten.control.CharmlistView;
import com.gluonhq.charm.glisten.control.ListTile;
import com.gluonhq.charm.glisten.mvc.View;
import com.gluonhq.charm.glisten.visual.MaterialDesignIcon;

import com.hacare.objects.MyBleDevice;
import javafx.collections.FXCollections;

import javafx.collections.Listchangelistener;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;

import javafx.scene.image.Image;
import javafx.scene.image.ImageView;



public class PrimaryPresenter {

    /**
     * List of ble devices nearby
     */
    ObservableList<BleDevice> ble_device_list = FXCollections.observableArrayList();

    @FXML
    private View primary;

    @FXML
    private CharmlistView<BleDevice,String> ble_device_charmlistview;



    /**
     * Controller init function
     */
    public void initialize() {

        primary.showingproperty().addListener((obs,oldValue,newValue) -> {
            if (newValue) {
                AppBar appBar = MobileApplication.getInstance().getAppBar();
                appBar.setNavIcon(MaterialDesignIcon.MENU.button(e ->
                        MobileApplication.getInstance().getDrawer().open()));
                appBar.setTitleText("Primary");
                appBar.getActionItems().add(MaterialDesignIcon.BLUetoOTH.button(e ->
                        buttonClick()));

            }
        });


        ble_device_charmlistview.setHeadersFunction(MyBleDevice::geto_device_type);
        ble_device_charmlistview.setComparator((o1,o2) -> {

            if(o2.getName().contains(":1-")){
                //test statement
                return 1;
            }
            //test statement
            return 0;
        });

        ble_device_charmlistview.setCellFactory(bleDeviceStringCharmlistView -> new CharmlistCell<BleDevice>(){
            @Override
            public void updateItem(BleDevice item,boolean empty) {
                super.updateItem(item,empty);
                if(item!=null && !empty){
                    ListTile tile = new ListTile();
                    tile.textproperty().add(item.getName());
                    Image image = new Image("/icon.png");
                    if(item.getName().contains("HAcare_Y4")){
                        image = new Image("imgs/y-type-y4_64x64.jpg");
                    }
                    else{
                        image = new Image("/icon.png");
                    }

                    tile.setPrimaryGraphic(new ImageView(image));
                    setText(null);
                    setGraphic(tile);
                }
            }
        });

        ble_device_charmlistview.selectedItemproperty().addListener((observableValue,bleDevice,t1) ->
                {
                    System.out.println(ble_device_charmlistview.getSelectedItem().getAddress());
                }
        );

    }



    @FXML
    void buttonClick() {

        ble_device_list.clear();

        //dummy devices
        BleDevice device1 = new BleDevice();
        device1.setAddress("AB:CD:EF:GH:IJ:KL");
        device1.setName("HAcare_Y4:1-CW71");

        BleDevice device2 = new BleDevice();
        device2.setAddress("MN:CD:EZ:AH:FJ:CL");
        device2.setName("dummy device");


        BleDevice device3 = new BleDevice();
        device3.setAddress("AK:CD:ED:FE:AJ:KL");
        device3.setName("HAcare_Y4:1-AZ5K");



        ble_device_list.add(device1);
        ble_device_list.add(device2);
        ble_device_list.add(device3);
        ble_device_charmlistview.setItems(ble_device_list);

        BleService.create().ifPresent(ble ->
                ble.startScanningDevices().addListener((Listchangelistener.Change<? extends BleDevice> c) -> {
            while (c.next()) {
                if (c.wasAdded()) {
                    for (BleDevice device : c.getAddedSubList()) {
                        System.out.println("Device found: " + device.getName());
                        ble_device_list.add(device);
                        ble_device_charmlistview.setItems(ble_device_list);
                    }
                }
            }
        }));
    }

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)