获取 NPE,无法在导航抽屉中的单击位置检索 ListView 内容

Getting NPE, cannot retrieve ListView content at clicked position in Navigation Drawer

我有一个 Navigation Drawer 并且想要检索我将要单击的 ListView 中的项目内的内容。我可以检索位置,但无法 link 到列表视图以获取单击项目的内容。在调试器中,我看到它存在一个列表视图,并且还指出了与我在 xml 文件中相同的 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 Class 中启动了两次,另一次在新的 class 中 Google 教程移动了 Drawer 对象匿名 class.

此外,SO 中还提到了任何关于如何从 Navigation Drawer 中专门检索项目的案例。虽然这个问题可以直观地调整为一个简单的 ListView.getItemAtPosition()。放回一个 class 一切正常。

您的代码段中存在逻辑错误,您已经在列表的 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();
  }
});

您必须在布局文件外部 的onItemClickListener 中找到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
        }
    });
}