Java 点击操作栏中的搜索按钮时崩溃(Android)
我一直在关注如何在我的活动中添加搜索栏。不幸的是,目前,每次我点击搜索图标,应用程序就会崩溃并立即重新启动(因此我看不到错误)。我能看到他们的代码和我的代码之间的唯一区别是,我使用的是标准活动,而他们使用的是片段。我已尝试相应地更改代码 这是我的活动中的代码:Java 点击操作栏中的搜索按钮时崩溃(Android),java,android,android-activity,android-recyclerview,searchview,Java,Android,Android Activity,Android Recyclerview,Searchview,我一直在关注如何在我的活动中添加搜索栏。不幸的是,目前,每次我点击搜索图标,应用程序就会崩溃并立即重新启动(因此我看不到错误)。我能看到他们的代码和我的代码之间的唯一区别是,我使用的是标准活动,而他们使用的是片段。我已尝试相应地更改代码 这是我的活动中的代码: public class AttractionsListActivity extends AppCompatActivity implements SearchView.OnQueryTextListener { public
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);
}
}
公共类属性Stactivity扩展AppCompativity实现SearchView.OnQueryTextListener{
公共静态吸引行适配器;
私人回收视图mRecyclerView;
公共静态开关柜;
公众静态公园;
私有列表吸引列表;
@凌驾
受保护的void onPause(){
super.onPause();
adapter.clearAdapter();
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u景点\u列表);
最终意图=getIntent();
parkPassed=intent.getParcelableExtra(“parkPassed”);
DataManager.loadAttractions(getBaseContext(),parkPassed.name.replaceAll(“\\s+”,”);
swipeContainer=(SwipeRefreshLayout)findViewById(R.id.swipeContainer);
swipeContainer.setOnRefreshListener(新的SwipeRefreshLayout.OnRefreshListener(){
@凌驾
公共void onRefresh(){
DataManager.loadAttractions(getBaseContext(),parkPassed.name.replaceAll(“\\s+”,”);
adapter.clearAdapter();
}
});
swipContainer.setColorSchemeColors(Color.parseColor(“#FF2F92”),
颜色;
这个.setupRecycler();
这个.setupImageLoader();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.action\u搜索,菜单);
final MenuItem=menu.findItem(R.id.action\u search);
最终搜索视图SearchView=(SearchView)MenuItemCompat.getActionView(项);
setOnQueryTextListener(这个);
MenuItemCompat.setOnActionExpandListener(项,新MenuItemCompat.OnActionExpandListener(){
@凌驾
公共布尔值onMenuItemActionCollapse(MenuItem项){
adapter.setFilter(attractionsList);
返回true;
}
@凌驾
公共布尔值onMenuItemActionExpand(MenuItem项){
返回true;
}
});
返回super.onCreateOptions菜单(菜单);
}
@凌驾
公共布尔onQueryTextChange(字符串newText){
最终列表filteredModelList=filter(attractionsList,newText);
adapter.setFilter(filteredModelList);
返回true;
}
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
返回false;
}
私有列表筛选器(列表模型、字符串查询){
query=query.toLowerCase();
final List filteredModelList=new ArrayList();
适用于(景点模型:模型){
最终字符串text=model.name.toLowerCase();
if(text.contains(查询)){
filteredModelList.add(model);
}
}
返回filteredModelList;
}
私人回收商(){
mRecyclerView=(RecyclerView)findViewById(R.id.attractions\u recycler);
最终LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(本);
mRecyclerView.setLayoutManager(linearLayoutManager);
adapter=new AttractionRowAdapter(AttractionsListativity.this,DataManager.attractionArrayList);
mRecyclerView.setAdapter(适配器);
}
}
在适配器中:
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();
}
}
公共类AttractionRowAdapter扩展了RecyclerView.Adapter{
私有列表吸引列表;
私人语境;
公共属性行适配器(上下文上下文,列表属性数组列表){
this.attractionsList=attractionsArray列表;
this.context=上下文;
}
@凌驾
public int getItemCount(){
返回值(null!=attractionsList?attractionsList.size():0);
}
公共空间设置过滤器(列出景点){
attractionsList=新的ArrayList();
景点列表。添加所有(景点);
notifyDataSetChanged();
}
}
我只发布了相关代码。所有必要的方法都在那里。在我点击搜索图标之前,一切正常
有什么想法吗?这在活动中从未初始化过
private List<Attraction> attractionsList;
这叫什么
public void setFilter(List<Attraction> attractions) {
attractionsList = new ArrayList<>();
attractionsList.addAll(attractions);
public void setFilter(列出景点){
attractionsList=新的ArrayList();
景点列表。添加所有(景点);
而且
addAll
抛出一个NullPointerException我发现很难相信没有崩溃日志,也很难相信应用程序会重新启动itself@cricket_007自从我第一次开始使用Android Studio以来,它一直在这样做。有时它会重新启动,有时它会完全崩溃。不知道为什么。你的活动的onCreate在哪里?我在屏幕上看不到它问题看起来您有NullPointerException。attractionsList
在您的活动中从未初始化。您说“崩溃”,但不提供堆栈跟踪。。。
public void setFilter(List<Attraction> attractions) {
attractionsList = new ArrayList<>();
attractionsList.addAll(attractions);