ModalBottomSheet

scss 复制代码
// 原来的按钮点击事件现在变得非常简洁
viewBinding.tvRegion.setOnClickListener(v -> showCountrySelectionModal());

private void showCountrySelectionModal() {
    CountrySelectionFragment fragment = CountrySelectionFragment.newInstance();
    fragment.setCountryViewModel(countryViewModel);
    fragment.setOnCountrySelectedListener(countryName -> {
        // 处理国家选择结果
        // countryViewModel.selectCountry(countryName); // 这个在Fragment内部已经处理了
        // 可以在这里添加其他需要的逻辑,比如更新UI
        updateRegionDisplay();
    });
    fragment.show(getSupportFragmentManager(), "country_selection");
}

private void updateRegionDisplay() {
    // 更新显示选中的地区
    String selectedCountry = countryViewModel.getCurrentSelectedCountry();
    if (selectedCountry != null) {
        viewBinding.tvRegion.setText(selectedCountry);
    }
}
public class CountrySelectionFragment extends TPModalBottomSheet {
    
    private CountryViewModel countryViewModel;
    private OnCountrySelectedListener listener;
    
    // 回调接口
    public interface OnCountrySelectedListener {
        void onCountrySelected(String countryName);
    }
    
    public static CountrySelectionFragment newInstance() {
        CountrySelectionFragment fragment = new CountrySelectionFragment();
        return fragment;
    }
    
    public void setCountryViewModel(CountryViewModel viewModel) {
        this.countryViewModel = viewModel;
    }
    
    public void setOnCountrySelectedListener(OnCountrySelectedListener listener) {
        this.listener = listener;
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 不直接设置属性,通过重写方法来实现
    }
    
    // 重写初始化TopBar的方法
    @Override
    public void initTopBar() {
        super.initTopBar();
        // 在这里设置TopBar相关属性
        if (topBar != null) {
            topBar.setTitle("Region");
            topBar.setEndOptionText("Done");
        }
        // 设置分隔线不显示
        if (topBarDivider != null) {
            topBarDivider.setVisibility(View.GONE);
        }
    }
    
    @Override
    public void onContentViewCreated(View view, Bundle savedInstanceState) {
        super.onContentViewCreated(view, savedInstanceState);
        
        if (countryViewModel != null) {
            setupCountrySelectionUI(view);
        }
    }
    
    // 重写这个方法来指定布局ID
    @Override
    protected int getLayoutResId() {
        return R.layout.fragment_region;
    }
    
    // 重写这个方法来指定屏幕类型
    protected ScreenType getScreenType() {
        return ScreenType.FULL_SCREEN;
    }
    
    private void setupCountrySelectionUI(View contentView) {
        RecyclerView recyclerView = contentView.findViewById(R.id.recyclerView_countries);
        CountryAdapter countryAdapter = new CountryAdapter(countryViewModel.getAllCountries());
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setAdapter(countryAdapter);
        
        // 设置当前选中的国家
        String currentCountry = countryViewModel.getCurrentSelectedCountry();
        if (currentCountry != null && !currentCountry.trim().isEmpty()) {
            countryAdapter.setSelectedCountry(currentCountry);
        }
        
        countryAdapter.setOnCountryClickListener(new CountryAdapter.OnCountryClickListener() {
            @Override
            public void onCountryClick(String countryName, int position) {
                countryViewModel.selectCountry(countryName);
                // 通知外部监听器
                if (listener != null) {
                    listener.onCountrySelected(countryName);
                }
                // 关闭对话框
                dismiss();
            }
        });
        
        // 观察过滤后的国家列表变化,实时更新RecyclerView
        countryViewModel.filteredCountries.observe(this, countries -> {
            countryAdapter.updateData(countries);
            if(countries.size() == countryViewModel.getAllCountries().size()){
                String selectedCountry = countryViewModel.getCurrentSelectedCountry();
                if(selectedCountry != null && !selectedCountry.isEmpty()){
                    int selectedPosition = countryAdapter.getSelectedPosition();
                    if(selectedPosition >= 0){
                        recyclerView.post(() -> {
                            recyclerView.smoothScrollToPosition(selectedPosition);
                        });
                    }
                }
            }
        });
        
        countryViewModel.selectedCountry.observe(this, selectedCountry -> {
            countryAdapter.setSelectedCountry(selectedCountry);
        });
        
        setupSearchView(contentView, countryAdapter);
    }
    
    /**
     * 设置搜索功能
     */
    private void setupSearchView(View contentView, CountryAdapter countryAdapter) {
        TPSearchBar tpSearchBar = contentView.findViewById(R.id.tp_search);
        
        // 创建搜索建议数据
        ArrayList<String> searchData = new ArrayList<>(countryViewModel.getAllCountries());
        
        // 创建搜索适配器
        SearchViewBaseAdapter<String> searchAdapter = new SearchViewBaseAdapter<String>(
                searchData,
                new SearchViewBaseAdapter.OnBindDataListener<String>() {
                    @Override
                    public void onBindViewHolder(String model, SearchViewBaseViewHolder viewHolder, int type, int position) {
                        viewHolder.setText(R.id.tv_country_name, model);
                    }
                    
                    @Override
                    public int getLayoutId(int type) {
                        return R.layout.item_country;
                    }
                }
        );
        
        // 设置搜索结果点击事件
        searchAdapter.setItemClickListener(new SearchViewBaseAdapter.OnItemClickListener<String>() {
            @Override
            public void onClick(View view, String data) {
                // 通过ViewModel选择国家
                countryViewModel.selectCountry(data);
                countryAdapter.setSelectedCountry(data);
                tpSearchBar.dismissSearchView();
                countryViewModel.clearSearch();
                
                // 通知外部监听器
                if (listener != null) {
                    listener.onCountrySelected(data);
                }
                // 关闭对话框
                dismiss();
            }
        });
        
        // 设置搜索字符实时监听
        tpSearchBar.setTextChangeListener(new TPMaterialSearchView.TextChangeListener() {
            @Override
            public void onTextChange(String searchText) {
                countryViewModel.filterCountries(searchText);
                // 过滤搜索建议
                if (searchText == null || searchText.trim().isEmpty()) {
                    searchAdapter.updateData(new ArrayList<>(countryViewModel.getAllCountries()));
                } else {
                    ArrayList<String> filteredList = getFilteredCountries(searchText);
                    searchAdapter.updateData(filteredList);
                }
            }
        });
        
        tpSearchBar.setManager(getChildFragmentManager());
        tpSearchBar.setSearchViewAdapter(searchAdapter);
        tpSearchBar.setOnQueryTextListener(new TPMaterialSearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
            
            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });
    }
    
    private ArrayList<String> getFilteredCountries(String searchText) {
        ArrayList<String> filteredList = new ArrayList<>();
        if (searchText != null && !searchText.trim().isEmpty()) {
            String searchLower = searchText.toLowerCase().trim();
            for (String country : countryViewModel.getAllCountries()) {
                if (country != null && country.toLowerCase().contains(searchLower)) {
                    filteredList.add(country);
                }
            }
        } else {
            filteredList.addAll(countryViewModel.getAllCountries());
        }
        return filteredList;
    }
}
scss 复制代码
public class CountrySelectionFragment extends TPModalBottomSheet {
    
    private CountryViewModel countryViewModel;
    private OnCountrySelectedListener listener;
    
    // 回调接口
    public interface OnCountrySelectedListener {
        void onCountrySelected(String countryName);
    }
    
    public static CountrySelectionFragment newInstance() {
        CountrySelectionFragment fragment = new CountrySelectionFragment();
        return fragment;
    }
    
    public void setCountryViewModel(CountryViewModel viewModel) {
        this.countryViewModel = viewModel;
    }
    
    public void setOnCountrySelectedListener(OnCountrySelectedListener listener) {
        this.listener = listener;
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 设置模态框属性
        screenType = ScreenType.FULL_SCREEN;
        dividerEnable = false;
        topBarTitleText = "Region";
        topBarEndText = "Done";
        contentLayoutId = R.layout.fragment_region;
    }
    
    @Override
    public void onContentViewCreated(View view, Bundle savedInstanceState) {
        super.onContentViewCreated(view, savedInstanceState);
        if (countryViewModel != null) {
            setupCountrySelectionUI(view);
        }
    }
    
    private void setupCountrySelectionUI(View contentView) {
        RecyclerView recyclerView = contentView.findViewById(R.id.recyclerView_countries);
        CountryAdapter countryAdapter = new CountryAdapter(countryViewModel.getAllCountries());
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setAdapter(countryAdapter);
        
        // 设置当前选中的国家
        String currentCountry = countryViewModel.getCurrentSelectedCountry();
        if (currentCountry != null && !currentCountry.trim().isEmpty()) {
            countryAdapter.setSelectedCountry(currentCountry);
        }
        
        countryAdapter.setOnCountryClickListener(new CountryAdapter.OnCountryClickListener() {
            @Override
            public void onCountryClick(String countryName, int position) {
                countryViewModel.selectCountry(countryName);
                // 通知外部监听器
                if (listener != null) {
                    listener.onCountrySelected(countryName);
                }
                // 关闭对话框
                dismiss();
            }
        });
        
        // 观察过滤后的国家列表变化,实时更新RecyclerView
        countryViewModel.filteredCountries.observe(this, countries -> {
            countryAdapter.updateData(countries);
            if(countries.size() == countryViewModel.getAllCountries().size()){
                String selectedCountry = countryViewModel.getCurrentSelectedCountry();
                if(selectedCountry != null && !selectedCountry.isEmpty()){
                    int selectedPosition = countryAdapter.getSelectedPosition();
                    if(selectedPosition >= 0){
                        recyclerView.post(() -> {
                            recyclerView.smoothScrollToPosition(selectedPosition);
                        });
                    }
                }
            }
        });
        
        countryViewModel.selectedCountry.observe(this, selectedCountry -> {
            countryAdapter.setSelectedCountry(selectedCountry);
        });
        
        setupSearchView(contentView, countryAdapter);
    }
    
    /**
     * 设置搜索功能
     */
    private void setupSearchView(View contentView, CountryAdapter countryAdapter) {
        TPSearchBar tpSearchBar = contentView.findViewById(R.id.tp_search);
        
        // 创建搜索建议数据
        ArrayList<String> searchData = new ArrayList<>(countryViewModel.getAllCountries());
        
        // 创建搜索适配器
        SearchViewBaseAdapter<String> searchAdapter = new SearchViewBaseAdapter<String>(
                searchData,
                new SearchViewBaseAdapter.OnBindDataListener<String>() {
                    @Override
                    public void onBindViewHolder(String model, SearchViewBaseViewHolder viewHolder, int type, int position) {
                        viewHolder.setText(R.id.tv_country_name, model);
                    }
                    
                    @Override
                    public int getLayoutId(int type) {
                        return R.layout.item_country;
                    }
                }
        );
        
        // 设置搜索结果点击事件
        searchAdapter.setItemClickListener(new SearchViewBaseAdapter.OnItemClickListener<String>() {
            @Override
            public void onClick(View view, String data) {
                // 通过ViewModel选择国家
                countryViewModel.selectCountry(data);
                countryAdapter.setSelectedCountry(data);
                tpSearchBar.dismissSearchView();
                countryViewModel.clearSearch();
                
                // 通知外部监听器
                if (listener != null) {
                    listener.onCountrySelected(data);
                }
                // 关闭对话框
                dismiss();
            }
        });
        
        // 设置搜索字符实时监听
        tpSearchBar.setTextChangeListener(new TPMaterialSearchView.TextChangeListener() {
            @Override
            public void onTextChange(String searchText) {
                countryViewModel.filterCountries(searchText);
                // 过滤搜索建议
                if (searchText == null || searchText.trim().isEmpty()) {
                    searchAdapter.updateData(new ArrayList<>(countryViewModel.getAllCountries()));
                } else {
                    ArrayList<String> filteredList = getFilteredCountries(searchText);
                    searchAdapter.updateData(filteredList);
                }
            }
        });
        
        tpSearchBar.setManager(getChildFragmentManager());
        tpSearchBar.setSearchViewAdapter(searchAdapter);
        tpSearchBar.setOnQueryTextListener(new TPMaterialSearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
            
            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });
    }
    
    private ArrayList<String> getFilteredCountries(String searchText) {
        ArrayList<String> filteredList = new ArrayList<>();
        if (searchText != null && !searchText.trim().isEmpty()) {
            String searchLower = searchText.toLowerCase().trim();
            for (String country : countryViewModel.getAllCountries()) {
                if (country != null && country.toLowerCase().contains(searchLower)) {
                    filteredList.add(country);
                }
            }
        } else {
            filteredList.addAll(countryViewModel.getAllCountries());
        }
        return filteredList;
    }
}

主要变化:

  1. 属性设置方式 - 直接给protected字段赋值,而不是调用方法:

    java 复制代码
    screenType = ScreenType.FULL_SCREEN;  // 而不是setScreenType()
    dividerEnable = false;                // 而不是setDividerEnable()
    topBarTitleText = "Region";          // 而不是setTitle()
  2. 布局设置 - 使用contentLayoutId字段:

    java 复制代码
    contentLayoutId = R.layout.fragment_region;
  3. UI初始化 - 重写onContentViewCreated方法,这是TPModalBottomSheet的标准生命周期方法

相关推荐
小喷友2 天前
第5章 高级UI与动画
前端·app·harmonyos
小喷友5 天前
第4章 数据与存储
前端·app·harmonyos
叽哥5 天前
Kotlin学习第 2 课:Kotlin 基础语法:掌握变量、数据类型与运算符
android·kotlin·app
木西6 天前
React Native DApp 开发全栈实战·从 0 到 1 系列(eas构建自定义客户端)
react native·web3·app
iOS阿玮8 天前
三年期已满,你的产品不再更新将于90天后下架。
uni-app·app·apple
hongweihao11 天前
儿子不收拾玩具,我用AI给他量身定制开发一个APP,这下舒服了
uni-app·app·ai编程
木西13 天前
React Native DApp 开发全栈实战·从 0 到 1 系列(expo-router)
react native·web3·app
iOS阿玮13 天前
苹果审核被拒要听劝,能沟通回复解决真的不用改!
uni-app·app·apple
iOS阿玮14 天前
成年人的沟通,不谈钱谈什么?谈感情?
uni-app·app·apple