android - 当按下 menuItem 以在 android 中显示用于列表视图的自定义适配器时,应用程序崩溃
问题描述
每当按下 menuItem 时,我都会尝试显示一个列表视图。我想显示自定义布局,因为我需要用于无法正常工作且我的应用程序崩溃的列表视图的自定义适配器。我的 android 应用程序中有 3-4 个自定义适配器,它们工作正常,但是自从我添加了另一个......前一个也停止工作了,我不知道为什么!我也在许多论坛上看到了几乎所有与此相关的问题,但对我没有任何帮助。请帮助我哪里错了..
下面是我的菜单项代码..
@Override
public boolean onOptionsItemSelected(MenuItem menuItem){
switch (menuItem.getItemId()){
case R.id.settings:
Intent intent = new Intent(this, OpenSettings.class);
startActivity(intent);
break;
case R.id.debacha:
Intent intent1 = new Intent(AyahsDisplay.this,DebachaDisplay.class);
this.startActivity(intent1);
break;
}
return super.onOptionsItemSelected(menuItem);
}
当按下 id 为“debach”的菜单项时,我开始新的活动,我打算在其中显示自定义列表视图,我收到错误和应用程序崩溃..
该部分的代码如下...
public class DebachaDisplay extends AppCompatActivity {
ListView list1;
ArrayList<debacha> debachas = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_debacha_display);
try {
parseXML(); //here i am parsing XML file to load data in "debachas" which is working fine
} catch (XmlPullParserException e) { }
catch (IOException e) { }
}
private void printDebacha(ArrayList<debacha> debachas){
list1 = findViewById(R.id.debachaList);
CustomDebachaview customDebachaview = new CustomDebachaview(DebachaDisplay.this,debachas);
list1.setAdapter(customDebachaview);
}
下面是 DisplayDebcha 活动的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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_width="match_parent"
android:layout_height="match_parent"
tools:context=".DebachaDisplay">
<ListView
android:id="@+id/debachaList"
android:background="#FDFFE9"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</ListView>
</LinearLayout>
下面是我的自定义适配器类的代码...
package com.example.demo;
import android.app.Activity;
import android.content.Intent;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.ArrayList;
public class CustomDebachaview extends ArrayAdapter<debacha> {
private ArrayList<debacha> debachas;
private Activity context;
public CustomDebachaview(Activity context,ArrayList<debacha> debachas){
super(context,R.layout.debacha_list_view,debachas);
this.debachas = debachas;
this.context = context;
}
@NonNull
@Override
public View getView(final int position , @Nullable View convertView , @Nullable final ViewGroup parent){
View r = convertView;
CustomDebachaview.viewHolder viewHolder = null;
if(r == null){
LayoutInflater layoutInflater = context.getLayoutInflater();
r = layoutInflater.inflate(R.layout.debacha_list_view,null,true);
viewHolder = new CustomDebachaview.viewHolder(r);
r.setTag(viewHolder);
}
else {
viewHolder = (CustomDebachaview.viewHolder) r.getTag();
}
viewHolder.Dnumber.setText("﴾ " + debachas.get(position).getDNumber() + " ﴿");
viewHolder.Dname.setText(debachas.get(position).getDName());
return r;
}
class viewHolder{
TextView Dnumber;
TextView Dname;
viewHolder(View v){
Dname = v.findViewById(R.id.Dnumber);
Dname = v.findViewById(R.id.Dname);
}
}
}
下面是自定义适配器列表视图布局文件代码...
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/Dnumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="debacha number"
android:paddingLeft="5dp"
android:textSize="17dp"
android:textColor="#297B16"
android:textStyle="bold"
/>
<TextView
android:id="@+id/Dname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Dname"
android:textSize="25dp"
android:textColor="#226A12"
/>
</LinearLayout>
我收到以下错误..
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.demo, PID: 1040
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at com.example.demo.CustomDebachaview.getView(CustomDebachaview.java:42)
at android.widget.AbsListView.obtainView(AbsListView.java:3219)
at android.widget.ListView.makeAndAddView(ListView.java:2219)
at android.widget.ListView.fillDown(ListView.java:827)
at android.widget.ListView.fillFromTop(ListView.java:888)
at android.widget.ListView.layoutChildren(ListView.java:1958)
at android.widget.AbsListView.onLayout(AbsListView.java:2991)
at android.view.View.layout(View.java:22407)
at android.view.ViewGroup.layout(ViewGroup.java:6589)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1801)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1567)
at android.view.View.layout(View.java:22407)
at android.view.ViewGroup.layout(ViewGroup.java:6589)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:22407)
at android.view.ViewGroup.layout(ViewGroup.java:6589)
at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:444)
at android.view.View.layout(View.java:22407)
at android.view.ViewGroup.layout(ViewGroup.java:6589)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:22407)
at android.view.ViewGroup.layout(ViewGroup.java:6589)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1812)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1656)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1565)
at android.view.View.layout(View.java:22407)
at android.view.ViewGroup.layout(ViewGroup.java:6589)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:1075)
at android.view.View.layout(View.java:22407)
at android.view.ViewGroup.layout(ViewGroup.java:6589)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3371)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2840)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1888)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8503)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
at android.view.Choreographer.doCallbacks(Choreographer.java:761)
at android.view.Choreographer.doFrame(Choreographer.java:696)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7073)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
I/Process: Sending signal. PID: 1040 SIG: 9
Process 1040 terminated.
非常感谢任何帮助:)
解决方案
我的错...这只是一个愚蠢的错误,视图构造函数中的错字使 Dnumber 为空:(
class viewHolder{
TextView Dnumber;
TextView Dname;
viewHolder(View v){
Dname = v.findViewById(R.id.Dnumber);
Dname = v.findViewById(R.id.Dname);
}
}
我正在初始化 2 次 Dname。
经验教训:请检查您的错字:)
推荐阅读
- angular - Angular - 对象参数的更改检测不起作用
- c++ - 在 C++ 中从 'char' 更改字符
- antd - 使用新安装的 antd 进行新的 create-react-app 安装会导致默认主题设置为黑底黑字的部分
- c# - 如何在发布管道中更改 Appsettings 和 Config 信息
- mysql - 查询 COUNT(field) 不考虑 id
- typescript - 设置 tsconfig.json 目标会破坏路径
- android - 如何在 Kotlin 中打开菜单项选择的新页面?
- excel - 在vba中的大写字母前放置一个空格
- database - 有没有办法为 SQL 查询等迭代器优化 Rust 过滤器?
- angular - 如何在另一个formArray中禁用反应式表单控件