我有一个设计支持 NavigationView 实现的活动。抽屉有 3 个菜单项:主页、按 X 排序、按 Y 排序。我的活动显示了一个 RecyclerView,其中的卡片显示来自列表的数据。该列表包含具有字符串标记(“X”或“Y”)的对象。I need to sort the RecyclerView by this tag when respective menu item is selected.
我的活动活动:
当我从 Home 片段调用 setFilter 方法时,我得到一个 NPE。
public class MyActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
.
.
.
init();
}
private void init() {
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mNavigationView = (NavigationView) findViewById(R.id.navigation);
mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
Home homeFrag = new Home();
mDrawerLayout.closeDrawers();
switch (menuItem.getItemId()) {
case R.id.nav_home:
if(!menuItem.isChecked()) {
setFragment(new Home());
}
break;
case R.id.nav_x:
if(!menuItem.isChecked()) {
homeFrag.setFilter("X");
}
break;
case R.id.nav_y:
if(!menuItem.isChecked()) {
homeFrag.setFilter("Y");
}
break;
}
menuItem.setChecked(true);
mToolbar.setTitle(menuItem.getTitle());
return true;
}
});
}
主页片段:
我在filteredObjects.clear() 的setFilter() 方法中得到一个NPE,如果我删除它,我会在for 循环中得到NPE。
public class Home extends Fragment {
private RecyclerView mRecyclerView;
List<Object> objects;
List<Object> filteredObjects;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_home, container, false);
.
.
.
mRecyclerView = (RecyclerView) v.findViewById(R.id.rv);
LinearLayoutManager llm = new LinearLayoutManager(v.getContext());
mRecyclerView.setLayoutManager(llm);
objects = new ArrayList<>();
filteredObjects = new ArrayList<>();
initializeData(objects);
initializeAdapter(objects);
return v;
}
public void setFilter(String queryText) {
queryText = queryText.toLowerCase();
filteredObjects.clear(); // I get a NullPointerException here
for (Object item : objects) {
final String text = item.tag.toLowerCase();
if (text.equals(queryText))
filteredObjects.add(item);
}
initializeAdapter(filteredObjects);
}
private void initializeAdapter(List<Object> list){
RVAdapter adapter = new RVAdapter(list);
adapter.notifyDataSetChanged();
mRecyclerView.setAdapter(adapter);
}
private void initializeData(List<Object> list){
list.add(new Object("Object 1", "X"));
list.add(new Object("Object 2", "Y"));
list.add(new Object("Object 3", "X"));
list.add(new Object("Object 4", "X"));
list.add(new Object("Object 5", "Y"));
list.add(new Object("Object 6", "Y"));
}
日志猫:
com.experiments.material E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.experiments.material, PID: 32273
java.lang.NullPointerException
at com.experiments.material.Home.setFilter(Home.java:170)
at com.experiments.material.MyActivity$2.onNavigationItemSelected(MyActivity.java:134)
at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:136)
at android.support.v7.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811)
at android.support.v7.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:153)
at android.support.v7.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958)
at android.support.design.internal.NavigationMenuPresenter.onItemClick(NavigationMenuPresenter.java:179)
at android.widget.AdapterView.performItemClick(AdapterView.java:299)
at android.widget.AbsListView.performItemClick(AbsListView.java:1152)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3014)
at android.widget.AbsListView$3.run(AbsListView.java:3865)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
at dalvik.system.NativeStart.main(Native Method)
编辑:activity_main.xml
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_height="?attr/actionBarSize"
android:layout_width="match_parent" >
<include
layout="@layout/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:name="com.experiments.material.Home"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigation"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:menu="@menu/navigation_items"
app:headerLayout="@layout/header_layout" />
</android.support.v4.widget.DrawerLayout>