在 ListView 中显示两个项目,在 null 对象引用上获取 setAdapter()
Posted
技术标签:
【中文标题】在 ListView 中显示两个项目,在 null 对象引用上获取 setAdapter()【英文标题】:Display two items in a ListView, getting setAdapter() on a null object reference 【发布时间】:2019-05-28 17:38:06 【问题描述】:我正在尝试使用两个单独的 TextView 项创建一个 ListView。
我的 ListView 是 content_main.xml (R.id.list) 的一部分,而 TextViews 是 list_item.xml (R.id.textUp, R.id.text2) 的一部分。
我得到的错误是ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
。这就是在我的 java 代码中分配 hashmap 和 listView 的方式:
private ListView list;
private HashMap<String, String> associatedItem;
protected void onCreate(Bundle savedInstanceState) //LayoutInflater inflater
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_goal_text);
list = findViewById(R.id.list);
associatedItem = new HashMap<String, String>();
...
还有处理程序:
public void doneButtonHandler(View view)
int day = picker.getDayOfMonth();
int month= picker.getMonth();
int year = picker.getYear();
Calendar calendar = Calendar.getInstance();
calendar.set(year,month,day);
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy", US);
String formatedDate = sdf.format(calendar.getTime());
associatedItem.put(formatedDate, strMssg);
ArrayList<HashMap<String, String>> listItems = new ArrayList<HashMap<String, String>>();
Iterator it = associatedItem.entrySet().iterator();
while (it.hasNext())
HashMap<String, String> resultsMap = new HashMap<>(2);
Map.Entry pair = (Map.Entry)it.next();
resultsMap.put("First Line",formatedDate);
resultsMap.put("Second Line",strMssg);//pair.getValue().toString()
listItems.add(resultsMap);
SimpleAdapter adapter = new SimpleAdapter(this, listItems ,R.layout.list_item,
new String[]"First Line", "Second Line",
new int[]R.id.textUp, R.id.text2);
list.setAdapter(adapter);
错误日志:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
at com.example.gryzhuk.goaltracker.AddGoal.doneButtonHandler(AddGoal.java:134)
activity_add_goal_text.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".AddGoal"
tools:layout_editor_absoluteY="81dp">
<TextView
android:id="@+id/textView"
android:layout_
android:layout_
android:layout_marginStart="20dp"
android:layout_marginLeft="20dp"
android:layout_marginTop="28dp"
android:layout_marginBottom="23dp"
android:text="@string/enter_goal"
android:textSize="20sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:onClick="nextButtonHandler"
android:id="@+id/next_btn"
android:layout_
android:layout_
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="53dp"
android:text="@string/next_button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/enteredGoalTxt"
app:layout_constraintVertical_bias="1.0" />
<EditText
android:id="@+id/enteredGoalTxt"
android:layout_
android:layout_
android:layout_marginStart="20dp"
android:layout_marginLeft="20dp"
android:layout_marginTop="126dp"
android:ems="10"
android:hint="Enter here"
android:inputType="textShortMessage"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
list_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_
android:layout_>
<TextView android:id="@+id/textUp"
android:layout_
android:layout_
android:textColor="@color/colorLineUp"
android:textSize="21sp"
android:textStyle="bold"
/>
<TextView android:id="@+id/text2"
android:layout_
android:layout_
android:textSize="16sp"
android:textColor="@color/colorLineBottom"
android:textStyle="bold"
/>
</LinearLayout>
content_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/activity_main">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fab="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_
android:layout_
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.teamproblemsolver.fabsubmenu.MainActivity">
<com.github.clans.fab.FloatingActionMenu
android:id="@+id/fab"
android:layout_
android:layout_
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginBottom="10dp"
fab:menu_animationDelayPerItem="50"
fab:menu_backgroundColor="@android:color/transparent"
fab:menu_buttonSpacing="0dp"
fab:menu_colorNormal="@color/colorPrimaryDark"
fab:menu_colorPressed="#c784d3ed"
fab:menu_colorRipple="#99FFFFFF"
fab:menu_fab_hide_animation="@anim/hide_to_bottom"
fab:menu_fab_show_animation="@anim/show_from_bottom"
fab:menu_fab_size="normal"
fab:menu_icon="@drawable/fab_add"
fab:menu_openDirection="up"
fab:menu_shadowColor="#66000000"
fab:menu_shadowRadius="4dp"
fab:menu_shadowXOffset="1dp"
fab:menu_shadowYOffset="3dp"
fab:menu_showShadow="true">
<com.github.clans.fab.FloatingActionButton
android:id="@+id/add_to_list"
android:layout_
android:layout_
android:src="@drawable/ic_add_to_list"
fab:fab_colorNormal="@color/colorPrimary"
fab:fab_colorPressed="#c784d3ed"
fab:fab_label="Add Goal"
fab:fab_size="mini" />
</com.github.clans.fab.FloatingActionMenu>
<ListView
android:id="@+id/list"
android:layout_
android:layout_ />
</RelativeLayout>
</android.support.constraint.ConstraintLayout>
【问题讨论】:
【参考方案1】:仔细检查以下方法调用:
setContentView(R.layout.activity_add_goal_text)
您说过,该列表位于 content_main.xml 中,但在您的代码中没有对该布局文件的引用。您想在调用 setContentView 时使用它吗? 还是包含的布局或片段?
此外,尽管使用起来比 listview 复杂一点,recyclerview 是在 Android 中显示项目列表的新方法。
【讨论】:
content_main.xml 是应用程序的主屏幕,我想在其中显示输出。R.layout.activity_add_goal_text
和 R.layout.activity_add_goal
是用户输入的不同布局。
您能否更新您遇到崩溃的 logcat 错误消息?
哦,所以你有两个活动?一个是显示列表的主屏幕,第二个是向列表添加项目的主屏幕,对吗?如果是这样,那么你需要改变你的方法,在 Android 中,每个 Acticity 通过 setContentView 绑定到一个布局。活动 A 无法从活动 B 访问视图。这就是您的 findViewById(R.id.list) 返回 null 的原因。要将列表从一个活动转移到另一个活动,您可能应该使用某种持久层(例如 Room)。一个 Activity 写入持久层,另一个从中读取。
@lukas.bloder 是的,有两种不同的用户输入布局,第三种布局content_main.xml
用于输出,这也是一个主屏幕。我应该使用 inflate() 方法将我的信息放入content_main.xml
吗?【参考方案2】:
在你的视图中检查这一行
associatedItem = new HashMap<String, String>();
还有这个在你的doneButtonHandler()
方法中
ArrayList<HashMap<String, String>> listItems = new ArrayList<HashMap<String, String>>();
在你的adapter
SimpleAdapter adapter = new SimpleAdapter(this, listItems ,R.layout.list_item,
new String[]"First Line", "Second Line",
new int[]R.id.textUp, R.id.text2);
那么listItems
来这里做什么?如果associatedItem
没有项目。
还要确保这在您的视图中被夸大了
list = findViewById(R.id.list);
并检查AddGoal.java
中的第 134 行并放置调试器,这将帮助您找到问题。
根据您更新的视图,问题在于您的 list = findViewById(R.id.list);
没有在您的活动中膨胀,因此 list
抛出为适配器 list.setAdapter(adapter)
设置的空对象引用错误。唯一的解决方案是更改您的实现方法,以编程方式扩展另一个视图或修改您的布局以在您的活动布局中使用列表视图。
【讨论】:
associatedItem
有用户在R.layout.activity_add_goal_text
和R.layout.activity_add_goal
布局中输入的数据。有associatedItem.put(formatedDate, strMssg)
- 这个哈希图的输出是正确的。
AddGoal.java 中的 134 是 list.setAdapter(adapter)
,它是 null 对象引用上的 setAdapter()
这意味着您的列表视图没有被夸大,您可以发布 (R.layout.activity_add_goal_text) 的布局代码。
R.layout.activity_add_goal_text 不包含 listView
好的,所以我又发布了一些 xml 文件【参考方案3】:
问题是setContentView(R.layout.activity_add_goal_text)
您还没有将列表视图放入 R.layout.activity_add_goal_text
这就是你面临空指针异常的原因
将列表视图放入 R.layout.activity_add_goal_text
希望有效果
【讨论】:
以上是关于在 ListView 中显示两个项目,在 null 对象引用上获取 setAdapter()的主要内容,如果未能解决你的问题,请参考以下文章
在具有动态高度的同一页面上颤动两个 listview.builder