2015-08-30 1 views
0

Я смущен о том, где добавить слушателя поиска, поскольку у меня есть список в фрагменте. Я объявил все переменные связанного с списком как статические. Адаптер также объявлен как статическая переменная в основном действии. Но когда я устанавливаю onQueryTextListener в onCreateOptionsMenu метод основной активности, я получаю исключение нулевого указателя на адаптере. Поэтому я подумал о добавлении слушателя в фрагмент, поскольку адаптер находится в фрагменте. Таким образом, я объявил переменную searchview как статическую переменную, чтобы я мог получить доступ к ней в фрагменте, но она не удалась, поскольку я получил исключение нулевого указателя в searchview. Может кто-нибудь наставит меня для этого, пожалуйста ..где добавить setOnQueryTextListener для поиска, чтобы отфильтровать список?

Основная деятельность

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_main, menu); 

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    searchView= (SearchView) menu.findItem(R.id.menu_search).getActionView(); 
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 

    return true; 
} 

Фрагмент кода

public class ViewStock extends Fragment { 
    final MainActivity act = (MainActivity) this.getActivity(); 
    public RecyclerView mRecyclerView; 

    public ViewStock() { 
     // Required empty public constructor 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View rootview = inflater.inflate(R.layout.fragment_view_stock, container, false); 
     act.array_data = new ArrayList<Item>(); 

     mRecyclerView = (RecyclerView)rootview.findViewById(R.id.my_recycler_view); 
     LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
     llm.setOrientation(LinearLayoutManager.VERTICAL); 
     mRecyclerView.setLayoutManager(llm); 

     act.db = new DBHandler(getActivity()); 
     ArrayList<Item> item_array_from_db = act.db.Get_items(); 

     for (int i = 0; i < item_array_from_db.size(); i++) { 

      int idno = item_array_from_db.get(i).getID(); 
      String name = item_array_from_db.get(i).getItem_name(); 
      String desc = item_array_from_db.get(i).getItem_desc(); 
      String qty = item_array_from_db.get(i).getItem_qty(); 
      Item cnt = new Item(); 
      cnt.setID(idno); 
      cnt.setItem_name(name); 
      cnt.setItem_desc(desc); 
      cnt.setItem_qty(qty); 

      act.array_data.add(cnt); 
     } 
     act.db.close(); 
     act.adapter=new ItemAdapter(getActivity(),act.array_data); 
     mRecyclerView.setAdapter(act.adapter); 

     return rootview; 
    } 
} 

SearchView активность

public class SearchResultsActivity extends Activity{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     handleIntent(getIntent()); 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 

     handleIntent(intent); 
    } 

    private void handleIntent(Intent intent) { 

     if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
      String query = intent.getStringExtra(SearchManager.QUERY); 

      showResults(query); 
     } 
    } 

    private void showResults(String query) { 
     // Query your data set and show results 
     // ... 
    } 
} 

Я не получаю никакого результата, делая это. Пожалуйста, помогите ..

ответ

0

Пожалуйста, обновите ваш код следующим:

первым попробовать это:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
getMenuInflater().inflate(R.menu.example, menu); 

this.menu = menu; 

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 

    SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 

    SearchView search = (SearchView) menu.findItem(R.id.search).getActionView(); 

    search.setSearchableInfo(manager.getSearchableInfo(getComponentName())); 

    search.setOnQueryTextListener(new OnQueryTextListener() { 

     @Override 
     public boolean onQueryTextChange(String query) { 

      loadHistory(query); 

      return true; 

     } 

    }); 

} 

Во-вторых, попробуйте следующее:

Ваш ИмяКласса расширяет активность реализует SearchView.OnQueryTextListener {

private SearchView mSearchView; 
private TextView mStatusView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
getWindow().requestFeature(Window.FEATURE_ACTION_BAR); 

setContentView(R.layout.main); 

mStatusView = (TextView) findViewById(R.id.status_text); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
super.onCreateOptionsMenu(menu); 

MenuInflater inflater = getMenuInflater(); 
inflater.inflate(R.menu.searchview_in_menu, menu); 
MenuItem searchItem = menu.findItem(R.id.action_search); 
mSearchView = (SearchView) searchItem.getActionView(); 
setupSearchView(searchItem); 

return true; 
} 

private void setupSearchView(MenuItem searchItem) { 

if (isAlwaysExpanded()) { 
mSearchView.setIconifiedByDefault(false); 
} else { 
searchItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM 
| MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 
} 

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
if (searchManager != null) { 
List searchables = searchManager.getSearchablesInGlobalSearch(); 

SearchableInfo info = searchManager.getSearchableInfo(getComponentName()); 
for (SearchableInfo inf : searchables) { 
if (inf.getSuggestAuthority() != null 
&& inf.getSuggestAuthority().startsWith("applications")) { 
info = inf; 
} 
} 
mSearchView.setSearchableInfo(info); 
} 

mSearchView.setOnQueryTextListener(this); 
} 

public boolean onQueryTextChange(String newText) { 
mStatusView.setText("Query = " + newText); 
return false; 
} 

public boolean onQueryTextSubmit(String query) { 
mStatusView.setText("Query = " + query + " : submitted"); 
return false; 
} 

public boolean onClose() { 
mStatusView.setText("Closed!"); 
return false; 
} 

protected boolean isAlwaysExpanded() { 
return false; 
} 
} 
+0

Спасибо за ответ .. я понимаю, почему вы использовали mStatusV МЭН ?? –