You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何将搜索过滤后的数据展示到新Fragment?

实现搜索结果跳转至新Fragment的方案

核心思路

不再在HomeFragment内处理搜索结果的展示,改为:

  1. 过滤出搜索结果数据
  2. 将数据传递给新建的SearchResultsFragment
  3. 通过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; // 标识已处理搜索提交事件
}

注意事项

  1. 确保你的Activity中有一个用于承载Fragment的容器(通常是FrameLayout,id为fragment_container)
  2. 如果使用Navigation Component,可以改用导航图跳转,传递参数的逻辑会更规范
  3. 原有onQueryTextChange的逻辑可以保留,继续在HomeFragment中实时展示全量数据的过滤结果,仅在用户提交搜索时跳转新页面

内容的提问来源于stack exchange,提问作者user20008723

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 20:00:37