实施 Spinner 后崩溃
Crash after implementing Spinner
我已经使用自定义适配器实现了 RecyclerView
,该适配器添加了由我的 class Item
制作的我自己的自定义对象。现在我正在尝试添加一个微调器,它将有一个 Strings
列表,当您单击 Spinner
下拉菜单中的一个对象时,它将更改 RecyclerView
的内容。基本上 Spinner
中的每个选项都会有自己的 RecyclerView
列表。但是,当我尝试向 Spinner
添加内容时,应用程序在我尝试启动时崩溃了。这是我添加到 onCreate(Bundle savedInstanceState)
导致应用程序崩溃的代码:
ArrayList<String> lists = new ArrayList<>();
lists.add("firstList");
lists.add("secondList");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_dropdown_item, lists);
dropdown.setAdapter(adapter);
我认为它可能会崩溃,因为 ArrayAdpater 以某种方式与我的自定义冲突 ItemAdapter
,但我不确定,因为我不熟悉使用适配器。有谁知道我该如何解决这个问题?
如果有帮助的话,我这里有我的自定义适配器:
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ExampleViewHolder> {
private ArrayList<Item> mItemList;
private OnItemClickListener mListener;
private int selectedPosition=-1;
public interface OnItemClickListener{
void onItemClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener){
mListener = listener;
}
public static class ExampleViewHolder extends RecyclerView.ViewHolder{
public TextView mTextView1;
public TextView mTextView2;
public ExampleViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
super(itemView);
mTextView1 = itemView.findViewById(R.id.text1);
mTextView2 = itemView.findViewById(R.id.text2);
itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(listener != null){
int position = getAdapterPosition();
if(position != RecyclerView.NO_POSITION){
listener.onItemClick(position);
}
}
}
});
}
}
public ItemAdapter(ArrayList<Item> itemList) {
mItemList = itemList;
}
@NonNull
@Override
public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.example_item, viewGroup, false);
ExampleViewHolder evh = new ExampleViewHolder(v, mListener);
return evh;
}
@Override
public void onBindViewHolder(@NonNull ExampleViewHolder exampleViewHolder, final int position) {
Item currentItem = mItemList.get(position);
exampleViewHolder.mTextView1.setText(currentItem.getText1());
exampleViewHolder.mTextView2.setText(currentItem.getText2());
if(selectedPosition==position)
exampleViewHolder.itemView.setBackgroundColor(Color.GREEN);
else
exampleViewHolder.itemView.setBackgroundColor(Color.parseColor("#ffffff"));
exampleViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity.positionOfChosenItem = position;
selectedPosition = position;
MainActivity.btnChange.setVisibility(View.VISIBLE);
MainActivity.btnDelete.setVisibility(View.VISIBLE);
MainActivity.changeAmountField.setVisibility(View.VISIBLE);
notifyDataSetChanged();
}
});
}
@Override
public int getItemCount() {
return mItemList.size();
}
编辑:我已确保将变量设置为正确的值,例如将 dropdown
设置为布局中的 Spinner
。
dropdown = findViewById(R.id.spinner);
并将 contentView 设置为 Spinner
所在的布局。setContentView(R.layout.activity_main);
编辑:这也是错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.barxqrscanner2, PID: 20357
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.barxqrscanner2/com.example.barxqrscanner2.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Spinner.setAdapter(android.widget.SpinnerAdapter)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2955)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Spinner.setAdapter(android.widget.SpinnerAdapter)' on a null object reference
at com.example.barxqrscanner2.MainActivity.buildDropDown(MainActivity.java:123)
at com.example.barxqrscanner2.MainActivity.onCreate(MainActivity.java:61)
at android.app.Activity.performCreate(Activity.java:7174)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2908)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Application terminated.
你的错误(NullPointerException)是由于这一行:
dropdown.setAdapter(adapter);
您的对象 dropdown
似乎是 null
。
我想你忘了实例化这个对象,或者你在实例化 dropdown
之前调用了 setAdapter()
。但是如果没有其余的代码,就很难更准确地判断真正的问题是什么。
最佳
我已经使用自定义适配器实现了 RecyclerView
,该适配器添加了由我的 class Item
制作的我自己的自定义对象。现在我正在尝试添加一个微调器,它将有一个 Strings
列表,当您单击 Spinner
下拉菜单中的一个对象时,它将更改 RecyclerView
的内容。基本上 Spinner
中的每个选项都会有自己的 RecyclerView
列表。但是,当我尝试向 Spinner
添加内容时,应用程序在我尝试启动时崩溃了。这是我添加到 onCreate(Bundle savedInstanceState)
导致应用程序崩溃的代码:
ArrayList<String> lists = new ArrayList<>();
lists.add("firstList");
lists.add("secondList");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_dropdown_item, lists);
dropdown.setAdapter(adapter);
我认为它可能会崩溃,因为 ArrayAdpater 以某种方式与我的自定义冲突 ItemAdapter
,但我不确定,因为我不熟悉使用适配器。有谁知道我该如何解决这个问题?
如果有帮助的话,我这里有我的自定义适配器:
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ExampleViewHolder> {
private ArrayList<Item> mItemList;
private OnItemClickListener mListener;
private int selectedPosition=-1;
public interface OnItemClickListener{
void onItemClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener){
mListener = listener;
}
public static class ExampleViewHolder extends RecyclerView.ViewHolder{
public TextView mTextView1;
public TextView mTextView2;
public ExampleViewHolder(@NonNull View itemView, final OnItemClickListener listener) {
super(itemView);
mTextView1 = itemView.findViewById(R.id.text1);
mTextView2 = itemView.findViewById(R.id.text2);
itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(listener != null){
int position = getAdapterPosition();
if(position != RecyclerView.NO_POSITION){
listener.onItemClick(position);
}
}
}
});
}
}
public ItemAdapter(ArrayList<Item> itemList) {
mItemList = itemList;
}
@NonNull
@Override
public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.example_item, viewGroup, false);
ExampleViewHolder evh = new ExampleViewHolder(v, mListener);
return evh;
}
@Override
public void onBindViewHolder(@NonNull ExampleViewHolder exampleViewHolder, final int position) {
Item currentItem = mItemList.get(position);
exampleViewHolder.mTextView1.setText(currentItem.getText1());
exampleViewHolder.mTextView2.setText(currentItem.getText2());
if(selectedPosition==position)
exampleViewHolder.itemView.setBackgroundColor(Color.GREEN);
else
exampleViewHolder.itemView.setBackgroundColor(Color.parseColor("#ffffff"));
exampleViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity.positionOfChosenItem = position;
selectedPosition = position;
MainActivity.btnChange.setVisibility(View.VISIBLE);
MainActivity.btnDelete.setVisibility(View.VISIBLE);
MainActivity.changeAmountField.setVisibility(View.VISIBLE);
notifyDataSetChanged();
}
});
}
@Override
public int getItemCount() {
return mItemList.size();
}
编辑:我已确保将变量设置为正确的值,例如将 dropdown
设置为布局中的 Spinner
。
dropdown = findViewById(R.id.spinner);
并将 contentView 设置为 Spinner
所在的布局。setContentView(R.layout.activity_main);
编辑:这也是错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.barxqrscanner2, PID: 20357
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.barxqrscanner2/com.example.barxqrscanner2.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Spinner.setAdapter(android.widget.SpinnerAdapter)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2955)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Spinner.setAdapter(android.widget.SpinnerAdapter)' on a null object reference
at com.example.barxqrscanner2.MainActivity.buildDropDown(MainActivity.java:123)
at com.example.barxqrscanner2.MainActivity.onCreate(MainActivity.java:61)
at android.app.Activity.performCreate(Activity.java:7174)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2908)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Application terminated.
你的错误(NullPointerException)是由于这一行:
dropdown.setAdapter(adapter);
您的对象 dropdown
似乎是 null
。
我想你忘了实例化这个对象,或者你在实例化 dropdown
之前调用了 setAdapter()
。但是如果没有其余的代码,就很难更准确地判断真正的问题是什么。
最佳