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;
}
}
主要变化:
-
属性设置方式 - 直接给protected字段赋值,而不是调用方法:
javascreenType = ScreenType.FULL_SCREEN; // 而不是setScreenType() dividerEnable = false; // 而不是setDividerEnable() topBarTitleText = "Region"; // 而不是setTitle()
-
布局设置 - 使用
contentLayoutId
字段:javacontentLayoutId = R.layout.fragment_region;
-
UI初始化 - 重写
onContentViewCreated
方法,这是TPModalBottomSheet的标准生命周期方法