【问题标题】:Passing searching data to Searchable Activity将搜索数据传递给 Searchable Activity
【发布时间】:2015-12-28 17:08:21
【问题描述】:

我有一个包含 2 个片段的主要活动。主要活动在操作栏中有一个SearchView。两个片段都有一个大量字符串列表,List<String>

流程是:

用户输入 Fragment I --> 选择一个字符串(比如说 Selection1) --> 基于 Selection1 在第二个片段中填充一个字符串列表 -- > 这里用户选择了第二个字符串 ---> 基于这两个字符串进行处理。

现在由于两个片段都包含大量字符串,因此用户在SearchView 中输入查询,该查询过滤列表并将其缩减为显示在SearchableActivity 中的较小列表。

现在的问题是SearchableActivity 如何访问这两个List<String> 以根据查询过滤它们并向用户显示精简列表。

目前我所做的是覆盖onSearchRequested并将数据传递为

    @Override
    public boolean onSearchRequested()
    {
        Bundle appData = new Bundle();
        appData.putString(FRAGMENT_ID, "Fragment_A");
        appData.putStringArrayList(SEARCH_LIST, searchList);
        startSearch(null, false, appData, false);
        return true;
    }

有没有更好的方法或标准的方法来处理这个问题,即允许数据从我的MainActivitySearchableActivity 的实现?

编辑:添加代码。显示如何在Fragment 中设置数据。 onDataReceived 从接收数据的HttpManager 中调用。

@Override
public void onDataReceived(String type,final Object object)
{
    switch(type)
    {
        case PopItConstants.UPDATE_LIST:
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run()
                {
                    updateCinemaList((List<String>) object);
                }
            });
            break;
    }
}

public void updateDataList(List<String> data)
{
    this.dataList = data;
    spinner.setVisibility(View.GONE);
    mAdapter.updateList(dataList);
}

【问题讨论】:

  • 希望这个链接stackoverflow.com/questions/7230893/…>可以帮助你
  • @Heyyou Data 基本上是 List&lt;String&gt;,它包含在片段 A 中。但 SearchableActivity 无权访问此列表。我不知道我需要在这里粘贴什么代码来进一步阐明这一点。
  • @Heyyou 当片段加载时我的HttpManager 从服务器下载列表并将其传递给片段(使用接口)。然后片段将此列表传递给适配器以显示。
  • @unrealsoul007 ,您是否将字符串传递给活动以进行搜索?

标签: android android-fragments android-activity searchview android-search


【解决方案1】:

几分钟前我刚刚在how can I send a List into another activity in Android Studio回答了一个类似的问题

我鼓励您重新考虑在活动和片段之间简单地传递数据的模式。考虑为您的应用创建一个或多个数据模型(非 Android 类),并将这些模型提供给需要它们的 Android 类(Activity、Fragments 等)。

从您的活动和片段中删除所有数据存储和操作代码,并将其放入模型中。

【讨论】:

  • 我所有的数据存储代码都在数据模型中,而不是在活动或片段中。为了便于理解,我刚刚在 Fragment 中提到了List&lt;String&gt;。感谢您的回答,但我一直在使用单例模式,正在寻找更好的方法。
【解决方案2】:

好的...所以我就是这样做的。

基本上,这两个片段中接收到的数据不仅仅是List&lt;String&gt;,而是模型。电影和地区,其中包含名称以外的详细信息,包括位置、评级等。

所以,首先我做了一个接口ISearchable

public Interface ISearchable
{
    // This contains the Search Text. An ISearchable item is included
    // in search results if query is contained in the String returned by this method
    public String getSearchText();

    //This is meant to return the String that must be displayed if this item is in search results
    public String getDisplayText();

    //This is meant to handle onClick of this searchableItem
    public void handleOnClick();
}

Cinema 和 Region 模型都实现了 ISearchable

在此之后,我使用了一个单例类 DataManager,我在其中维护了一个 List&lt;ISearchable&gt; currentSearchList

public class DataManager
{
    .....<singleton implementation>....
    List<ISearchable> currentSearchList;

    public void setSearchList(List<ISearchable> searchList)
    {
        this.currentSearchList = searchList;
    }

    public List<ISearchable> getSearchList()
    {
        return this.currentSearchList;
    }

}

因此,每当加载片段(Fragment_A 或 Fragment_B)时,它都会更新此currentSearchList,因此当SearchableActivity 执行搜索时,它所要做的就是DataManager.getInstance().getSearchList(),然后使用此列表过滤掉一个匹配项列表。

这就是我如何处理在 Activity 中使用 Lists 而不是 SearchableActivity 需要执行搜索的问题。

我知道这可能不是最好的解决方案,所以,我期待提出建议和批评,并以此来达成更好的解决方案。

【讨论】:

    猜你喜欢
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    相关资源
    最近更新 更多