我的SearchView
中有一个ActionBar
来过滤结果并在ListView
中显示。用户点击某个项目后,我会开始一个新活动来显示该项目的详细信息。当他们点击后退按钮时,我想显示过滤后的搜索结果。他们输入的搜索短语保留在SearchView中。
实现这一目标的最佳方法是什么?
答案 0 :(得分:1)
在我的应用中,我有几种方法可以将搜索结果放入搜索结果活动中。如果搜索活动是在结果中发送的,我会在Intent
个附加内容中检查结果。如果发生方向更改,我会使用savedInstanceState
重新填充搜索结果,如果我导航到详细信息活动,然后再次返回,我会从保存的文件中重新填充搜索结果。所以我的onCreate()
代码有这样的结构:
if(savedInstanceState != null) {
terms = savedInstanceState.getStringArrayList(TERM_RESULTS_KEY);
} else {
Bundle args = getIntent().getExtras();
if(args != null) {
resultsData = args.getParcelableArrayList(SearchActivity.SEARCH_RESULT_ARGS);
//...
} else {
terms = getSavedResults();
}
}
当我离开活动时(如您提到的那样转到详细信息页面),我保存搜索结果如下:
private void saveResults(ArrayList<String> results) {
try {
FileOutputStream fileOutputStream = openFileOutput(SAVED_RESULTS_FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream out = new ObjectOutputStream(fileOutputStream);
out.writeObject(results);
out.close();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
由于ArrayList
是可序列化的,因此使用ObjectOutputStream
写入磁盘非常容易。然后,当用户点击您的详细信息活动上的后退按钮时,您将检索以前的搜索结果,如下所示:
@SuppressWarnings("unchecked")
private ArrayList<String> getSavedResults() {
ArrayList<String> savedResults = null;
try {
FileInputStream inputStream = openFileInput(SAVED_RESULTS_FILENAME);
ObjectInputStream in = new ObjectInputStream(inputStream);
savedResults = (ArrayList<String>) in.readObject();
in.close();
inputStream.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
return savedResults;
}