在旋转手机上维护搜索视图的结果

问题描述 投票:2回答:1

我对此很新(java,android和stack overflow),所以请耐心等待。我有一堆产品,我从我的数据库中读取,我存储/添加到我的类型产品的ArrayList,并将其输出到Recycleview。我还从GitHub实现了一个名为materialsearchview的搜索视图库,一切都按预期工作。这意味着我最初在列表中有每个产品,当我搜索时,我得到一个新列表,其中包含具有相同或接近相同标题的产品。但是,在旋转电话时,列表会返回到每个产品的默认列表,并保留搜索视图中的文本。有没有办法在这个片段中旋转手机后保留从搜索中获得的新产品列表?

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);
  }
}
java android android-fragments rotation searchview
1个回答
0
投票

我将使用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();
      }
  }
© www.soinside.com 2019 - 2024. All rights reserved.