AndroidPicker icon indicating copy to clipboard operation
AndroidPicker copied to clipboard

LinkageProvider 如何传对象数组进去

Open fuchengxin opened this issue 3 years ago • 1 comments

仿照dome的AntFortuneLikeProvider ,里面的provideFirstData与linkageSecondData 都只能用List<Sring>,如果是对象数组,显示的都是直接tostring之后的结果,对象在这里面怎么用?

fuchengxin avatar Dec 23 '21 09:12 fuchengxin

对象数组的数,你的对象实现TextProvider接口即可,可参阅AddressPickercom.github.gzuliyujiang.wheelpicker.impl.AddressProvider如:

public class AddressProvider implements LinkageProvider {
    private final List<ProvinceEntity> data;
    private final int mode;

    public AddressProvider(@NonNull List<ProvinceEntity> data, int mode) {
        this.data = data;
        this.mode = mode;
    }

    @Override
    public boolean firstLevelVisible() {
        return mode == AddressMode.PROVINCE_CITY_COUNTY || mode == AddressMode.PROVINCE_CITY;
    }

    @Override
    public boolean thirdLevelVisible() {
        return mode == AddressMode.PROVINCE_CITY_COUNTY || mode == AddressMode.CITY_COUNTY;
    }

    @NonNull
    @Override
    public List<ProvinceEntity> provideFirstData() {
        return data;
    }

    @NonNull
    @Override
    public List<CityEntity> linkageSecondData(int firstIndex) {
        if (data.size() == 0) {
            return new ArrayList<>();
        }
        if (firstIndex == INDEX_NO_FOUND) {
            firstIndex = 0;
        }
        return data.get(firstIndex).getCityList();
    }

    @NonNull
    @Override
    public List<CountyEntity> linkageThirdData(int firstIndex, int secondIndex) {
        List<CityEntity> data = linkageSecondData(firstIndex);
        if (data.size() == 0) {
            return new ArrayList<>();
        }
        if (secondIndex == INDEX_NO_FOUND) {
            secondIndex = 0;
        }
        return data.get(secondIndex).getCountyList();
    }

    @Override
    public int findFirstIndex(Object firstValue) {
        if (firstValue == null) {
            return INDEX_NO_FOUND;
        }
        if (firstValue instanceof ProvinceEntity) {
            return data.indexOf(firstValue);
        }
        for (int i = 0, n = data.size(); i < n; i++) {
            ProvinceEntity entity = data.get(i);
            if (entity.getCode().equals(firstValue.toString()) ||
                    entity.getName().contains(firstValue.toString())) {
                return i;
            }
        }
        return INDEX_NO_FOUND;
    }

    @Override
    public int findSecondIndex(int firstIndex, Object secondValue) {
        if (secondValue == null) {
            return INDEX_NO_FOUND;
        }
        List<CityEntity> cityList = linkageSecondData(firstIndex);
        if (secondValue instanceof CityEntity) {
            return cityList.indexOf(secondValue);
        }
        for (int i = 0, n = cityList.size(); i < n; i++) {
            CityEntity entity = cityList.get(i);
            if (entity.getCode().equals(secondValue.toString()) ||
                    entity.getName().contains(secondValue.toString())) {
                return i;
            }
        }
        return INDEX_NO_FOUND;
    }

    @Override
    public int findThirdIndex(int firstIndex, int secondIndex, Object thirdValue) {
        if (thirdValue == null) {
            return INDEX_NO_FOUND;
        }
        List<CountyEntity> countyList = linkageThirdData(firstIndex, secondIndex);
        if (thirdValue instanceof CountyEntity) {
            return countyList.indexOf(thirdValue);
        }
        for (int i = 0, n = countyList.size(); i < n; i++) {
            CountyEntity entity = countyList.get(i);
            if (entity.getCode().equals(thirdValue.toString()) ||
                    entity.getName().contains(thirdValue.toString())) {
                return i;
            }
        }
        return INDEX_NO_FOUND;
    }

}
class AddressEntity implements TextProvider, Serializable {
    private String code;
    private String name;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String provideText() {
        return name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        AddressEntity that = (AddressEntity) o;
        return Objects.equals(code, that.code) &&
                Objects.equals(name, that.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(code, name);
    }

    @NonNull
    @Override
    public String toString() {
        return "AddressEntity{" +
                "code='" + code + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

}

liyujiang-gzu avatar Dec 25 '21 05:12 liyujiang-gzu