我有一个 fragment 可以做一些与搜索 View 相关的事情,它运行良好,
但我想创建一个 Activity 来执行通常作为 fragment 的任务。
XML 没有问题,主要问题在 Java 代码中。 fragment 中的一些方法,我不知道它们在 Activity 中的对立面。
fragment 代码:
public class AirlineSearchFragment extends Fragment implements SearchView.OnQueryTextListener{
private RecyclerView recyclerview;
private List<AirlineData> airlinesDataModel;
private AirlinesSearchViewAdapter adapter;
public AirlineSearchFragment()
{
setHasOptionsMenu(true);
}
@Override
public void onCreate(Bundle savedInstanceState) {
setHasOptionsMenu(true);
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setHasOptionsMenu(true);
View view = inflater.inflate(R.layout.airline_search_fragment, container, false);
recyclerview = (RecyclerView) view.findViewById(R.id.recyclerview);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
recyclerview.setLayoutManager(layoutManager);
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setHasOptionsMenu(true);
String[] locales = Locale.getISOCountries();
airlinesDataModel = new ArrayList<>();
airlinesDataModel.addAll(AirlinesCore.airlinesList);
adapter = new AirlinesSearchViewAdapter(airlinesDataModel);
recyclerview.setAdapter(adapter);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.auto_complete, menu);
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.setOnQueryTextListener(this);
MenuItemCompat.setOnActionExpandListener(item,
new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when collapsed
adapter.setFilter(airlinesDataModel);
return true; // Return true to collapse action view
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
// Do something when expanded
return true; // Return true to expand action view
}
});
}
@Override
public boolean onQueryTextChange(String newText) {
final List<AirlineData> filteredModelList = filter(airlinesDataModel, newText);
adapter.setFilter(filteredModelList);
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
private List<AirlineData> filter(List<AirlineData> models, String query) {
query = query.toLowerCase();
final List<AirlineData> filteredModelList = new ArrayList<>();
for (AirlineData model : models) {
if(model.arabicName==null)
{
model.arabicName="";
}
if(model.shortName==null)
{
model.shortName="";
}
if(model.name==null)
{
model.name="";
}
final String text = model.name.toLowerCase()+model.shortName.toLowerCase()
+model.arabicName.toLowerCase()+model.code.toLowerCase();
if (text.contains(query)) {
filteredModelList.add(model);
}
}
return filteredModelList;
}
}
我的 Activity 使用从 fragment 复制的一些方法(我应该添加什么?):
public class AirlinesSearchActivity extends AppCompatActivity implements SearchView.OnQueryTextListener{
private RecyclerView recyclerview;
private List<AirlineData> airlinesDataModel;
private AirlinesSearchViewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_airlines_search);
}
@Override
public boolean onQueryTextChange(String newText) {
final List<AirlineData> filteredModelList = filter(airlinesDataModel, newText);
adapter.setFilter(filteredModelList);
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
private List<AirlineData> filter(List<AirlineData> models, String query) {
query = query.toLowerCase();
final List<AirlineData> filteredModelList = new ArrayList<>();
for (AirlineData model : models) {
if(model.arabicName==null)
{
model.arabicName="";
}
if(model.shortName==null)
{
model.shortName="";
}
if(model.name==null)
{
model.name="";
}
final String text = model.name.toLowerCase()+model.shortName.toLowerCase()
+model.arabicName.toLowerCase()+model.code.toLowerCase();
if (text.contains(query)) {
filteredModelList.add(model);
}
}
return filteredModelList;
}
}
最佳答案
尝试将 onCreateView
和 onViewCreated
中的逻辑移动到 Activity.onCreate()
。
然后覆盖 Activity 中的 onCreateOptionsMenu
并复制 Fragment 中的逻辑
关于Android 将当前的 Fragment 类转换为 Activity 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37759061/