【问题标题】:Crash after implementing Spinner实施 Spinner 后崩溃
【发布时间】:2019-03-13 14:03:24
【问题描述】:

我已经实现了一个带有自定义适配器的RecyclerView,它添加了一个我自己的自定义对象,这些对象由我的类Item 制成。现在我正在尝试添加一个 Spinner,它将有一个 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 设置为 Spinnerdropdown = 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.

【问题讨论】:

标签: android android-spinner android-adapter


【解决方案1】:

您的错误(NullPointerException)是由于这一行:

dropdown.setAdapter(adapter);

您的对象dropdown 似乎是null

我想你忘了实例化这个对象,或者你在实例化dropdown 之前调用了setAdapter()。但是如果没有剩下的代码,就很难更准确地说出真正的问题是什么。

最好的

【讨论】:

  • 是的!就像你说的那样。感谢您的协助!
  • 乐于助人:)
猜你喜欢
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多