我有一个导航抽屉,想要检索我要点击的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()
。回到一个班级,一切正常。
答案 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
}
});
}