首页 > 解决方案 > RecyclerView:列表和适配器为空

问题描述

我想从我在片段2的editTexts中输入的内容中为片段1中的recyclerview添加项目,然后单击fab以添加具有我在片段2中输入的详细信息的项目。问题是当我调试mExampleAdapter /适配器和 mExampleList 一样为空,我不知道为什么

这是片段 1 JAVA 代码

package com.example.admin.test2;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import java.util.ArrayList;


/**
 * A simple {@link Fragment} subclass.
 */
public class MainScreen extends Fragment {

    private ArrayList <ExampleItem> mExampleList;

    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    public MainScreen() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View view = inflater.inflate(R.layout.fragment_main_screen, container, false);

        DataHandlers dataHandlers = new DataHandlers();

        try {
            String deTails = dataHandlers.getDetails();
            int aMount = dataHandlers.getAmount();
            Toast.makeText(getActivity().getApplicationContext(), deTails + "" + aMount, Toast.LENGTH_LONG).show();
            //TAS DITO KA NA MAG SET TEXT SA MGA TEXTVIEW NG AMOUNT AT DETAILS

        } catch (Exception ex) {
            Toast.makeText(getActivity().getApplicationContext(), ex.getMessage().toString(), Toast.LENGTH_LONG).show();
        }

        mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);

        mExampleList = new ArrayList <>();
        //   mExampleList.add(new ExampleItem(R.drawable.ic_library_add_black_24dp, "", "", "ADD EXPENSES"));


        mRecyclerView = view.findViewById(R.id.recyclerView);
        mRecyclerView.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(getContext());
        mAdapter = new ExampleAdapter(mExampleList);

        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);

        return view;
    }

    public void insertItem() {
        // String amount = String.valueOf(amountt.getText());
        //  String details = String.valueOf((detailss.getText()));
        // String date = String.valueOf((datee.getText()));
/*
        Bundle bundle = getArguments();
        String deTails = bundle.getString("Details");
        String aMount = bundle.getString("Amount");
*/
        //int position = bundle.getInt("Position");
        DataHandlers dataHandlers = new DataHandlers();

        String deTails = dataHandlers.getDetails();
        int aMount = dataHandlers.getAmount();

        mExampleList.add(0, new ExampleItem(R.drawable.food, "Food & Drink", "" + deTails, "₱ " + aMount));
        mAdapter.notifyDataSetChanged();


    }
}

这是片段 2 的 JAVA 代码

package com.example.admin.test2;


import android.app.DatePickerDialog;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

public class Expense extends Fragment {


    public Expense() {
        // Required empty public constructor
    }
    //SPINNER
    Spinner sp1;
    CustomAdapter adapter;
    String[] names = {"Food & Drink", "Shopping", "Transportation", "Home", "Bills & Fees", "Entertainment", "Healthcare", "Education", "Beauty", "Others"};
    int[] images = {R.drawable.food, R.drawable.shopping, R.drawable.transportation, R.drawable.home, R.drawable.bills, R.drawable.entertainment, R.drawable.medical, R.drawable.education, R.drawable.beauty, R.drawable.others};

    //DATE PICKER
    private EditText mDisplayDate;
    private DatePickerDialog.OnDateSetListener mDateSetListener;

    //FOR THE ADD ITEM
    FloatingActionButton fab;
    private ArrayList<ExampleItem> mExampleList;
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    EditText amount;
    EditText detail;

    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate (R.layout.fragment_expense, container, false);


        //spinner
        sp1 = (Spinner)view.findViewById(R.id.customSpinner);

        adapter = new CustomAdapter(getActivity(), names, images);
        sp1.setAdapter(adapter);

        //fab onClick - sending values to the recycler view
        fab = (FloatingActionButton) view.findViewById(R.id.fabs);
        amount = (EditText) view.findViewById(R.id.textAmountt);
        detail = (EditText) view.findViewById(R.id.textDetailss);

        final DataHandlers dataHandlers = new DataHandlers();

        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
        //        String amountValue = amount.getText().toString();
        //        String detailValue = detail.getText().toString();

        //        mExampleList.add(0, new ExampleItem(R.drawable.entertainment, "Entertainment", detailValue, "₱ " + amountValue));
        //        mAdapter.notifyDataSetChanged();

                dataHandlers.setAmount(Integer.parseInt(amount.getText().toString()));
                dataHandlers.setDetails(detail.getText().toString());
                Toast.makeText(getActivity().getApplicationContext(), dataHandlers.getDetails() + dataHandlers.getAmount(), Toast.LENGTH_LONG).show();

                android.support.v4.app.FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                MainScreen ms = new MainScreen();
                ms.insertItem();
                fragmentTransaction.replace(R.id.replaceLayout, ms);
                fragmentTransaction.commit();

            }
        });

        int pos = sp1.getSelectedItemPosition();

        //date picker
        mDisplayDate = (EditText) view.findViewById(R.id.datePick);

        mDisplayDate.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                Calendar cal = Calendar.getInstance();
                int year = cal.get(Calendar.YEAR);
                int month = cal.get(Calendar.MONTH);
                int day = cal.get(Calendar.DAY_OF_MONTH);

                DatePickerDialog dialog = new DatePickerDialog(getActivity(),
                        android.R.style.Theme_Holo_Light_Dialog_MinWidth,
                        mDateSetListener,
                        year, month, day);
                dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                dialog.show();

            }
        });

        mDateSetListener = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int month, int day) {
                //Calendar calendar = Calendar.getInstance();
                //String currentDate = DateFormat.getDateInstance().format(calendar.getTime());

                month = month + 1;
                String date = month + "-" + day + "-" + year;
                mDisplayDate.setText(date);


            }
        };

        return view;
    }

}

这是适配器的 Java 代码

package com.example.admin.test2;

import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {

    private ArrayList<ExampleItem> mExampleList;


    public static class ExampleViewHolder extends RecyclerView.ViewHolder
    {

        public ImageView mImageView;
        public TextView mLabel;
        public TextView mDetails;
        public TextView mAmount;

        public ExampleViewHolder(View itemView) {
            super(itemView);

            mImageView = itemView.findViewById(R.id.imageIcon);
            mLabel = itemView.findViewById(R.id.textLabel);
            mDetails = itemView.findViewById(R.id.textDetails);
            mAmount = itemView.findViewById(R.id.textAmount);
        }
    }

    public ExampleAdapter(ArrayList<ExampleItem> exampleList)
    {
        mExampleList = exampleList;
    }

    @NonNull
    @Override
    public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.customlist, parent, false);
        ExampleViewHolder evh = new ExampleViewHolder(view);
        return evh;
    }

    @Override
    public void onBindViewHolder(@NonNull ExampleViewHolder holder, int position) {
        ExampleItem currentItem = mExampleList.get(position);

        holder.mImageView.setImageResource(currentItem.getmImageResource());
        holder.mLabel.setText(currentItem.getMlabel());
        holder.mDetails.setText(currentItem.getMdetails());
        holder.mAmount.setText(currentItem.getMamount());
    }

    @Override
    public int getItemCount() {
        if (mExampleList == null)
            return 0;
        else
            return  mExampleList.size();
    }
}

这是项目的获取者和设置者

package com.example.admin.test2;

public class ExampleItem {

    private int mImageResource;
    private String mlabel;
    private String mdetails;
    private String mamount;

    public ExampleItem(int imageResource, String label, String details, String amount)
    {
        mImageResource = imageResource;
        mlabel = label;
        mdetails = details;
        mamount = amount;
    }

    public int getmImageResource()
    {
        return mImageResource;
    }

    public String getMlabel() {
        return mlabel;
    }

    public String getMdetails() {
        return mdetails;
    }

    public String getMamount() {
        return mamount;
    }


}

这就是错误

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.admin.test2, PID: 30713
                  java.lang.NullPointerException: Attempt to invoke virtual method 'void java.util.ArrayList.add(int, java.lang.Object)' on a null object reference
                      at com.example.admin.test2.MainScreen.insertItem(MainScreen.java:82)
                      at com.example.admin.test2.Expense$1.onClick(Expense.java:101)
                      at android.view.View.performClick(View.java:6897)
                      at android.view.View$PerformClick.run(View.java:26101)
                      at android.os.Handler.handleCallback(Handler.java:789)
                      at android.os.Handler.dispatchMessage(Handler.java:98)
                      at android.os.Looper.loop(Looper.java:164)
                      at android.app.ActivityThread.main(ActivityThread.java:6944)
                      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)

根据调试 mExampleList 和 mAdapter 为空..

mExampleList.add(0, new ExampleItem(R.drawable.food, "Food & Drink", "" + deTails, "₱ " + aMount));
        mAdapter.notifyDataSetChanged();

标签: javaandroidandroid-fragmentsandroid-recyclerview

解决方案


推荐阅读