Android中如何将搜索过滤后的数据展示到新Fragment?
实现搜索结果跳转至新Fragment的方案
核心思路
不再在HomeFragment内处理搜索结果的展示,改为:
- 过滤出搜索结果数据
- 将数据传递给新建的
SearchResultsFragment - 通过Fragment事务完成页面跳转,在新Fragment中展示结果
步骤1:让数据模型支持序列化传递
首先需要让你的RecyclerviewModel实现Parcelable接口,这样才能在Fragment间传递数据列表:
public class RecyclerviewModel implements Parcelable { // 你的原有字段,例如private String searching; // 原有构造方法、getter/setter方法 // Parcelable实现代码 protected RecyclerviewModel(Parcel in) { searching = in.readString(); // 其他字段按顺序读取,比如in.readInt()、in.readBoolean()等 } public static final Creator<RecyclerviewModel> CREATOR = new Creator<RecyclerviewModel>() { @Override public RecyclerviewModel createFromParcel(Parcel in) { return new RecyclerviewModel(in); } @Override public RecyclerviewModel[] newArray(int size) { return new RecyclerviewModel[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(searching); // 其他字段按顺序写入 } }
步骤2:创建SearchResultsFragment
新建专门展示搜索结果的Fragment,包含RecyclerView布局和数据接收逻辑:
布局文件(fragment_search_results.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_search_results" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
Fragment代码
public class SearchResultsFragment extends Fragment { private RecyclerView recyclerView; private ArrayList<RecyclerviewModel> searchResults; // 静态方法创建Fragment实例并传递数据 public static SearchResultsFragment newInstance(ArrayList<RecyclerviewModel> results) { SearchResultsFragment fragment = new SearchResultsFragment(); Bundle args = new Bundle(); args.putParcelableArrayList("search_results", results); fragment.setArguments(args); return fragment; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 接收传递过来的搜索结果 if (getArguments() != null) { searchResults = getArguments().getParcelableArrayList("search_results"); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_search_results, container, false); recyclerView = view.findViewById(R.id.rv_search_results); // 设置RecyclerView布局管理器 recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); // 初始化适配器并绑定数据 RecyclerviewAdapter adapter = new RecyclerviewAdapter(searchResults, getContext(), this); recyclerView.setAdapter(adapter); return view; } }
步骤3:修改HomeFragment的搜索逻辑
调整原有代码,过滤数据后跳转至新Fragment:
修改search方法(仅负责过滤数据)
// 修改后的SEARCH METHOD private ArrayList<RecyclerviewModel> search(String s) { ArrayList<RecyclerviewModel> mydatalist = new ArrayList<>(); for (RecyclerviewModel object : datalist) { if (object.getSearching().contains(s.toLowerCase().trim())) { mydatalist.add(object); } } return mydatalist; }
修改onQueryTextSubmit方法(跳转新Fragment)
@Override public boolean onQueryTextSubmit(String query) { pd.setTitle("Searching"); pd.show(); Runnable progressRunnable = new Runnable() { @Override public void run() { // 执行数据过滤 ArrayList<RecyclerviewModel> searchResults = search(query); pd.cancel(); // 回到主线程执行Fragment跳转 requireActivity().runOnUiThread(() -> { // 创建搜索结果Fragment实例 SearchResultsFragment resultsFragment = SearchResultsFragment.newInstance(searchResults); // 执行Fragment替换跳转 getParentFragmentManager().beginTransaction() .replace(R.id.fragment_container, resultsFragment) // fragment_container是Activity中承载Fragment的容器ID .addToBackStack(null) // 可选:加入回退栈,方便用户返回HomeFragment .commit(); }); } }; // 明确指定主线程Looper,避免线程问题 Handler pdCanceller = new Handler(Looper.getMainLooper()); pdCanceller.postDelayed(progressRunnable, 3000); return true; // 标识已处理搜索提交事件 }
注意事项
- 确保你的Activity中有一个用于承载Fragment的容器(通常是FrameLayout,id为
fragment_container) - 如果使用Navigation Component,可以改用导航图跳转,传递参数的逻辑会更规范
- 原有
onQueryTextChange的逻辑可以保留,继续在HomeFragment中实时展示全量数据的过滤结果,仅在用户提交搜索时跳转新页面
内容的提问来源于stack exchange,提问作者user20008723
相关产品推荐
相关产品推荐

