将搜索数据传递给Searchable Activity

时间:2015-09-30 19:27:23

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

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

流程是:

  

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

现在由于两个片段都包含大量字符串,因此用户在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);
}

2 个答案:

答案 0 :(得分:1)

几分钟前我在how can I send a List into another activity in Android Studio

回答了类似的问题

我鼓励您重新思考简单地在活动和碎片中传递数据的模式。考虑为您的应用程序创建一个或多个数据模型(非Android类),并使这些模型可用于需要它们的Android类(活动,碎片等)。

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

答案 1 :(得分:1)

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

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

所以,首先,我创建了一个界面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<ISearchable> 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(),然后使用此列表用于过滤匹配项目列表。

这就是我处理活动中列表的问题,而不是使用搜索需要执行搜索的SearchableActivity。

我知道这可能不是最好的解决方案,因此,我期待建议和批评,并使用它来达到更好的解决方案。