在旋转 phone 时维护搜索视图的结果
Maintaining result of search view on rotating phone
我对此很陌生(java、android 和堆栈溢出),请耐心等待。我有一堆从我的数据库中读取的产品,我 store/add 到我的 ArrayList 类型的产品并将其输出到 Recycleview。我还从 GitHub 实现了一个名为 materialsearchview 的搜索视图库,一切都按预期工作。这意味着最初我拥有列表中的所有产品,当我搜索时,我得到一个新列表,其中包含具有相同或接近相同标题的产品。但是,在旋转 phone 后,列表会返回到每个产品的默认列表,并且搜索视图中的文本会保留。在这个片段中旋转 phone 后,有没有办法保留从搜索中派生的新产品列表?
public class GFragment extends Fragment{
private static final String READ_ALL_PRODUCTS_REQUEST_URL = "****";
RecyclerView recyclerView;
ProductsAdapter adapter;
List<Product> productList;
TextView product_id;
ImageView product_image;
MaterialSearchView searchView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable
ViewGroup container, @Nullable final Bundle savedInstanceState) {
setHasOptionsMenu(true);
View view = inflater.inflate(R.layout.fragment_products, null);
productList = new ArrayList<>();
recyclerView = (RecyclerView) view.findViewById(R.id.list);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
StringRequest stringRequest = new StringRequest(Request.Method.GET,
READ_ALL_PRODUCTS_REQUEST_URL , new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONArray products = new JSONArray(response);
for (int i = 0; i < products .length(); i++) {
JSONObject productObject = products.getJSONObject(i);
//storing the variables from database
String id = productObject.getString("product_id");
String title=
productObject.getString("product_title");
Product product= new Product(id);
productList.add(product);
}
adapter = new productAdapter(getActivity(), productList);
recyclerView.setAdapter(adapter);
//Search
searchView = (MaterialSearchView)
getActivity().findViewById(R.id.search_view);
searchView.setOnSearchViewListener(new
MaterialSearchView.SearchViewListener() {
@Override
public void onSearchViewShown() {
}
@Override
public void onSearchViewClosed() {
searchView = (MaterialSearchView)
getActivity().findViewById(R.id.search_view);
adapter = new
productAdapter(getActivity(),productList);
recyclerView.setAdapter(adapter);
}
});
searchView.setOnQueryTextListener(new
MaterialSearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
if (query != null && !query.isEmpty()) {
List<Product> currentproductList = new
ArrayList<Product>();
for (Productitem : producteList) {
String title = item.getProduct_title();
if (title.contains(query) ||
title.toLowerCase().contains(query) ||
title.toUpperCase().contains(query)) {
currentproductList.add(item);
}
}
adapter = new VideoGameAdapter(getActivity(),
currentproductList);
recyclerView.setAdapter(adapter);
}
else {
adapter = new productAdapter(getActivity(),
productList);
recyclerView.setAdapter(adapter);
}
//Hide Keyboard
View view =
getActivity().findViewById(android.R.id.content);
if (view != null) {
InputMethodManager imm = (InputMethodManager)
getActivity().getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.
getWindowToken(), 0);
}
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newText != null && !newText.isEmpty()) {
List<Product> currentproductList = new
ArrayList<Product>();
for (Productitem : productList) {
String title = item.getProduct_title();
if (title.contains(newText) ||
title.toLowerCase().contains(newText) ||
title.toUpperCase().contains(newText)) {
currentproductList.add(item);
}
}
adapter = new productAdapter(getActivity(),
currentproductList);
recyclerView.setAdapter(adapter);
}
else {
adapter = new productAdapter(getActivity(),
productList);
recyclerView.setAdapter(adapter);
}
return true;
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getActivity(), "Error",
Toast.LENGTH_SHORT).show();
}
});
Volley.newRequestQueue(getActivity()).add(stringRequest);
return view
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.main, menu);
MaterialSearchView searchView =
(MaterialSearchView)getActivity().findViewById(R.id.search_view);
final MenuItem item = menu.findItem(R.id.action_search);
searchView.setMenuItem(item);
}
}
我会使用 onSaveInstance 状态,这将在轮换之间保存您的状态。将您的 JSON 结果变成一个全局字符串,然后检索结果。它会是这样的:
public class GFragment extends Fragment{
private String json;
private final String KEY_JSON = "json";
//..rest of variables
}
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY_JSON, user);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable
ViewGroup container, @Nullable final Bundle savedInstanceState) {
if (savedInstanceState != null) {
json = savedInstanceState.getString(KEY_JSON);
} else {
json = ""
}
//...rest of onCreateView()
if (!TextUtils.isEmpty(json) {
parseJSON();
}
}
private void parseJSON() {
try {
JSONArray products = new JSONArray(response);
for (int i = 0; i < products .length(); i++) {
JSONObject productObject = products.getJSONObject(i);
//storing the variables from database
String id = productObject.getString("product_id");
String title=
productObject.getString("product_title");
Product product= new Product(id);
productList.add(product);
}
adapter = new productAdapter(getActivity(), productList);
recyclerView.setAdapter(adapter);
//..any other parsing
}
catch (JSONException e) {
e.printStackTrace();
}
}
我对此很陌生(java、android 和堆栈溢出),请耐心等待。我有一堆从我的数据库中读取的产品,我 store/add 到我的 ArrayList 类型的产品并将其输出到 Recycleview。我还从 GitHub 实现了一个名为 materialsearchview 的搜索视图库,一切都按预期工作。这意味着最初我拥有列表中的所有产品,当我搜索时,我得到一个新列表,其中包含具有相同或接近相同标题的产品。但是,在旋转 phone 后,列表会返回到每个产品的默认列表,并且搜索视图中的文本会保留。在这个片段中旋转 phone 后,有没有办法保留从搜索中派生的新产品列表?
public class GFragment extends Fragment{
private static final String READ_ALL_PRODUCTS_REQUEST_URL = "****";
RecyclerView recyclerView;
ProductsAdapter adapter;
List<Product> productList;
TextView product_id;
ImageView product_image;
MaterialSearchView searchView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable
ViewGroup container, @Nullable final Bundle savedInstanceState) {
setHasOptionsMenu(true);
View view = inflater.inflate(R.layout.fragment_products, null);
productList = new ArrayList<>();
recyclerView = (RecyclerView) view.findViewById(R.id.list);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
StringRequest stringRequest = new StringRequest(Request.Method.GET,
READ_ALL_PRODUCTS_REQUEST_URL , new Response.Listener<String>() {
@Override
public void onResponse(String response) {
try {
JSONArray products = new JSONArray(response);
for (int i = 0; i < products .length(); i++) {
JSONObject productObject = products.getJSONObject(i);
//storing the variables from database
String id = productObject.getString("product_id");
String title=
productObject.getString("product_title");
Product product= new Product(id);
productList.add(product);
}
adapter = new productAdapter(getActivity(), productList);
recyclerView.setAdapter(adapter);
//Search
searchView = (MaterialSearchView)
getActivity().findViewById(R.id.search_view);
searchView.setOnSearchViewListener(new
MaterialSearchView.SearchViewListener() {
@Override
public void onSearchViewShown() {
}
@Override
public void onSearchViewClosed() {
searchView = (MaterialSearchView)
getActivity().findViewById(R.id.search_view);
adapter = new
productAdapter(getActivity(),productList);
recyclerView.setAdapter(adapter);
}
});
searchView.setOnQueryTextListener(new
MaterialSearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
if (query != null && !query.isEmpty()) {
List<Product> currentproductList = new
ArrayList<Product>();
for (Productitem : producteList) {
String title = item.getProduct_title();
if (title.contains(query) ||
title.toLowerCase().contains(query) ||
title.toUpperCase().contains(query)) {
currentproductList.add(item);
}
}
adapter = new VideoGameAdapter(getActivity(),
currentproductList);
recyclerView.setAdapter(adapter);
}
else {
adapter = new productAdapter(getActivity(),
productList);
recyclerView.setAdapter(adapter);
}
//Hide Keyboard
View view =
getActivity().findViewById(android.R.id.content);
if (view != null) {
InputMethodManager imm = (InputMethodManager)
getActivity().getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.
getWindowToken(), 0);
}
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newText != null && !newText.isEmpty()) {
List<Product> currentproductList = new
ArrayList<Product>();
for (Productitem : productList) {
String title = item.getProduct_title();
if (title.contains(newText) ||
title.toLowerCase().contains(newText) ||
title.toUpperCase().contains(newText)) {
currentproductList.add(item);
}
}
adapter = new productAdapter(getActivity(),
currentproductList);
recyclerView.setAdapter(adapter);
}
else {
adapter = new productAdapter(getActivity(),
productList);
recyclerView.setAdapter(adapter);
}
return true;
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getActivity(), "Error",
Toast.LENGTH_SHORT).show();
}
});
Volley.newRequestQueue(getActivity()).add(stringRequest);
return view
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.main, menu);
MaterialSearchView searchView =
(MaterialSearchView)getActivity().findViewById(R.id.search_view);
final MenuItem item = menu.findItem(R.id.action_search);
searchView.setMenuItem(item);
}
}
我会使用 onSaveInstance 状态,这将在轮换之间保存您的状态。将您的 JSON 结果变成一个全局字符串,然后检索结果。它会是这样的:
public class GFragment extends Fragment{
private String json;
private final String KEY_JSON = "json";
//..rest of variables
}
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY_JSON, user);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable
ViewGroup container, @Nullable final Bundle savedInstanceState) {
if (savedInstanceState != null) {
json = savedInstanceState.getString(KEY_JSON);
} else {
json = ""
}
//...rest of onCreateView()
if (!TextUtils.isEmpty(json) {
parseJSON();
}
}
private void parseJSON() {
try {
JSONArray products = new JSONArray(response);
for (int i = 0; i < products .length(); i++) {
JSONObject productObject = products.getJSONObject(i);
//storing the variables from database
String id = productObject.getString("product_id");
String title=
productObject.getString("product_title");
Product product= new Product(id);
productList.add(product);
}
adapter = new productAdapter(getActivity(), productList);
recyclerView.setAdapter(adapter);
//..any other parsing
}
catch (JSONException e) {
e.printStackTrace();
}
}