获取NPE,无法在导航抽屉

时间:2016-07-30 19:59:36

标签: android listview nullpointerexception navigation-drawer listviewitem

我有一个导航抽屉,想要检索我要点击的ListView项目内的内容。我可以检索位置,但无法链接到列表视图以获取单击项目的内容。在调试器中,我看到它出现了一个列表视图,并且还指示了我的xd文件中的id left_drawer,我尝试检索:

 android.widget.ListView{634ed4d VFED.VC.. .F..H.ID 0,0-630,1731 #7f0e004f app:id/left_drawer}

所以我想知道我在做NPE时做错了什么以及为什么我不能检索项目

 @Override
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {

//I have the position of the list view, and want to retrieve the content of the selected item at that position
ListView listView = (ListView) view.findViewById(R.id.left_drawer);
 String sk = (String) listView.getItemAtPosition(position);//NPE because listView is null?
        Log.d("DEBUG", "onItemClick: "+sk);

//      listView.getChildAt(0);
//listView.getSelectedItem();

}
}

这是错误消息

  Process: android.com.myapp, PID: 28051 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.widget.ListView.getItemAtPosition(int)' on a null object reference
                                                                                at android.com.myapp.DrawerItemClickListener.onItemClick(DrawerItemClickListener.java:22)

这是导航抽屉

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"

    >
    <!-- The main content view -->

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fragment_as_list"
    android:name="android.com.myApp.FragmentA"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
        />

    <ListView android:id="@+id/left_drawer"
        android:layout_width="240dp"

        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="19dp"
        android:background="@drawable/image_background"
        android:paddingTop="?android:attr/actionBarSize"

        android:paddingLeft="@dimen/activity_horizontal_margin"

        android:paddingRight="@dimen/activity_horizontal_margin"

        android:paddingBottom="@dimen/activity_vertical_margin"
      />
</android.support.v4.widget.DrawerLayout>

更新

在我看来,这不是一个微不足道的NPE问题。即使我尝试设置条件来消除异常也是不可避免的,因为ListView在Main类中再次启动两次,在新类中,Google教程移动了Drawer对象的匿名类。

此外,在SO中提到了如何从Navigation Drawer专门检索项目。虽然问题直观地适用于简单的ListView.getItemAtPosition()。回到一个班级,一切正常。

2 个答案:

答案 0 :(得分:1)

您的代码段中存在逻辑错误,您已经在列表的 setOnItemClickListener 方法中,并且您再次初始化您的列表,然后肯定它不会包含任何内容。

yourListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {

    //get your content in Object (parent class of all )
    Object objContent = yourListView.getAdapter().getItem(position);
    String valContent = objContent .toString();
    Toast.makeText(YourMainActivity.this,"Content= "+valContent, Toast.LENGTH_LONG).show();
  }
});

答案 1 :(得分:1)

您必须在onItemClickListener的布局文件 outside 中找到ListView。您可以将ListView引用分配给实例字段,然后在单击事件处理程序中使用它。

这是伪代码(目前无法测试):

private ListView list;    

public onCreate(..) {
    setContentView(..);

    list = findViewById(R.id.left_drawer);
    list.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
            //here you have a reference of your ListView, and the position of the clicked item.
            list.getAdapter().getItem(position); //this is the clicked item
        }
    });
}