将搜索数据传递给 Searchable Activity
Passing searching data to Searchable Activity
我有一个主要 activity,它有 2 个片段。主 activity 在操作栏中有一个 SearchView
。这两个片段都有一个包含大量字符串的列表,List<String>
。
流程是:
User enters Fragment I --> Selects a string (lets say Selection1) --> Based on Selection1 a list of strings is populated in the second fragment --> Here the user selects a second String ---> Processing based on these two strings.
现在由于两个片段都包含大量字符串,用户在 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;
}
有没有更好的方法或标准方法来处理这个问题,即允许数据基于我的 MainActivity
到 SearchableActivity
的实现?
编辑:添加代码。显示如何在 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);
}
几分钟前我刚刚在 how can I send a List into another activity in Android Studio
回答了一个类似的问题
我鼓励您重新考虑在 Activity 和 Fragment 之间简单传递数据的模式。考虑为您的应用程序创建一个或多个数据模型(非 Android 类),并使这些模型可用于 Android 类(活动、片段等)需要他们。
从您的活动和片段中删除所有数据存储和操作代码,并将其放入模型中。
好的...所以我就是这样做的。
基本上,两个片段中接收到的数据不仅仅是 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
。
在此之后,我使用了一个单例 class 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
执行搜索时,它必须do 是 DataManager.getInstance().getSearchList()
然后使用此列表过滤出匹配项列表。
这就是我如何处理 Activity 中的列表问题,而不是需要执行搜索的 SearchableActivity。
我知道这可能不是最好的解决方案,所以,我期待着建议和批评,并利用它们得出更好的解决方案。
我有一个主要 activity,它有 2 个片段。主 activity 在操作栏中有一个 SearchView
。这两个片段都有一个包含大量字符串的列表,List<String>
。
流程是:
User enters Fragment I --> Selects a string (lets say Selection1) --> Based on Selection1 a list of strings is populated in the second fragment --> Here the user selects a second String ---> Processing based on these two strings.
现在由于两个片段都包含大量字符串,用户在 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;
}
有没有更好的方法或标准方法来处理这个问题,即允许数据基于我的 MainActivity
到 SearchableActivity
的实现?
编辑:添加代码。显示如何在 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);
}
几分钟前我刚刚在 how can I send a List into another activity in Android Studio
回答了一个类似的问题我鼓励您重新考虑在 Activity 和 Fragment 之间简单传递数据的模式。考虑为您的应用程序创建一个或多个数据模型(非 Android 类),并使这些模型可用于 Android 类(活动、片段等)需要他们。
从您的活动和片段中删除所有数据存储和操作代码,并将其放入模型中。
好的...所以我就是这样做的。
基本上,两个片段中接收到的数据不仅仅是 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
。
在此之后,我使用了一个单例 class 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
执行搜索时,它必须do 是 DataManager.getInstance().getSearchList()
然后使用此列表过滤出匹配项列表。
这就是我如何处理 Activity 中的列表问题,而不是需要执行搜索的 SearchableActivity。
我知道这可能不是最好的解决方案,所以,我期待着建议和批评,并利用它们得出更好的解决方案。