1

Я слежу за this tutorial, чтобы узнать, как добавить панель поиска к моей деятельности. К сожалению, на данный момент, каждый раз, когда я нажимаю значок поиска, приложение аварийно завершает работу и немедленно перезапускается (поэтому я не вижу ошибки). Единственное различие, которое я вижу между своим кодом и моим, заключается в том, что я использую стандартную активность, тогда как они используют фрагменты. Я попытался соответствующим образом изменить свой код.Ошибка при нажатии кнопки поиска в панели действий (Android)

Это код в моей деятельности:

public class AttractionsListActivity extends AppCompatActivity implements SearchView.OnQueryTextListener { 
    public static AttractionRowAdapter adapter; 
    private RecyclerView mRecyclerView; 
    public static SwipeRefreshLayout swipeContainer; 
    public static Park parkPassed; 
    private List<Attraction> attractionsList; 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     adapter.clearAdaptor(); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_attractions_list); 

     final Intent intent = getIntent(); 
     parkPassed = intent.getParcelableExtra("parkPassed"); 
     DataManager.loadAttractions(getBaseContext(), parkPassed.name.replaceAll("\\s+","")); 

     swipeContainer = (SwipeRefreshLayout) findViewById(R.id.swipeContainer); 
     swipeContainer.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       DataManager.loadAttractions(getBaseContext(), parkPassed.name.replaceAll("\\s+","")); 
       adapter.clearAdaptor(); 
      } 
     }); 
     swipeContainer.setColorSchemeColors(Color.parseColor("#FF2F92"), 
       Color.parseColor("#0080FF")); 

     this.setupRecycler(); 
     this.setupImageLoader(); 
    } 

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

     final MenuItem item = menu.findItem(R.id.action_search); 
     final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item); 
     searchView.setOnQueryTextListener(this); 

     MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() { 
        @Override 
        public boolean onMenuItemActionCollapse(MenuItem item) { 
         adapter.setFilter(attractionsList); 
         return true; 
        } 

        @Override 
        public boolean onMenuItemActionExpand(MenuItem item) { 
         return true; 
        } 
       }); 
     return super.onCreateOptionsMenu(menu); 
    } 


    @Override 
    public boolean onQueryTextChange(String newText) { 
     final List<Attraction> filteredModelList = filter(attractionsList, newText); 
     adapter.setFilter(filteredModelList); 
     return true; 
    } 

    @Override 
    public boolean onQueryTextSubmit(String query) { 
     return false; 
    } 

    private List<Attraction> filter(List<Attraction> models, String query) { 
     query = query.toLowerCase(); 

     final List<Attraction> filteredModelList = new ArrayList<>(); 
     for (Attraction model : models) { 
      final String text = model.name.toLowerCase(); 
      if (text.contains(query)) { 
       filteredModelList.add(model); 
      } 
     } 
     return filteredModelList; 
    } 

    private void setupRecycler() { 
     mRecyclerView = (RecyclerView) findViewById(R.id.attractions_recycler); 
     final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); 
     mRecyclerView.setLayoutManager(linearLayoutManager); 

     adapter = new AttractionRowAdapter(AttractionsListActivity.this, DataManager.attractionArrayList); 
     mRecyclerView.setAdapter(adapter); 
    } 
} 

И в адаптере:

public class AttractionRowAdapter extends RecyclerView.Adapter<AttractionRowHolder> { 
    private List<Attraction> attractionsList; 
    private Context context; 

    public AttractionRowAdapter(Context context, List<Attraction> attractionsArrayList) { 
     this.attractionsList = attractionsArrayList; 
     this.context = context; 
    } 

    @Override 
    public int getItemCount() { 
     return (null != attractionsList ? attractionsList.size() : 0); 
    } 

    public void setFilter(List<Attraction> attractions) { 
     attractionsList = new ArrayList<>(); 
     attractionsList.addAll(attractions); 
     notifyDataSetChanged(); 
    } 
} 

Я только отправил соответствующий код. Все необходимые методы есть. Все работает до тех пор, пока я не коснусь значка поиска.

Любые идеи?

+0

Мне трудно поверить, что нет журналов сбоев или почему приложение перезагрузилось. –

+0

@ cricket_007 Это делается с тех пор, как я впервые начал использовать Android Studio. Иногда он перезапускается, иногда он полностью падает. Не знаю, почему. – user3746428

+0

Где находится onCreate для вашей деятельности? Я не вижу его в вопросе –

ответ

2

Это никогда не инициализируется в деятельности

private List<Attraction> attractionsList; 

Этот перечень передается вокруг, как нуль, и, скорее всего, приводит к NullPointerException в этом

adapter.setFilter(attractionsList); 

Который называет это

public void setFilter(List<Attraction> attractions) { 
    attractionsList = new ArrayList<>(); 
    attractionsList.addAll(attractions); 

И addAll выбрасывает исключение NullPointerException

Смежные вопросы