从适配器迁移到活动时发生NullPointerException

时间:2019-08-22 11:33:40

标签: android nullpointerexception recycler-adapter

我是android新手。我正在尝试使用Intent从适配器移至活动,并且已从片段中调用了适配器。我收到以下异常:

    Process: ****.****.****, PID: 16146
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
        at android.content.ComponentName.<init>(ComponentName.java:130)
        at android.content.Intent.<init>(Intent.java:6751)
        at ****.****.****.HealthAdapter$1.onClick(HealthAdapter.java:48)
        at android.view.View.performClick(View.java:7339)
        at android.view.View.performClickInternal(View.java:7305)
        at android.view.View.access$3200(View.java:846)
        at android.view.View$PerformClick.run(View.java:27788)
        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:7076)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) 

这是我的适配器类

    public class HealthAdapter extends RecyclerView.Adapter<HealthAdapter.ViewHolder>  {
    private Context context;
    private List<Health> list;
    private Context mContext;
    private static final String TAG = "RecyclerViewAdapter";

    public HealthAdapter(Context context, List<Health> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.single_item, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        Health health = list.get(position);

        holder.textTitle.setText(health.getTitle());
        holder.textId.setText(String.valueOf(health.getId()));

        holder.parentLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Log.d(TAG, "onClick: clicked on: " + mImageNames.get(position));
                Log.d(TAG, "onClick: clicked on: ");

                //Toast.makeText(mContext, mImageNames.get(position), Toast.LENGTH_SHORT).show();

                Intent intent = new Intent(mContext, HealthDetailsActivity.class);


                //intent.putExtra("image_name", mImageNames.get(position));

                intent.putExtra("id", 1);
                mContext.startActivity(intent);
            }
        });

    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        public TextView textTitle, textId;
        LinearLayout parentLayout;

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

            textTitle = itemView.findViewById(R.id.main_title);
            textId = itemView.findViewById(R.id.main_id);
            parentLayout = itemView.findViewById(R.id.parent_layout);

        }
    }

这是我从Fragment调用适配器的代码

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

        hList = (RecyclerView) healthFragmentUI.findViewById(R.id.main_list);

        healthList = new ArrayList<>();
        adapter = new HealthAdapter(getActivity(),healthList);

        linearLayoutManager = new LinearLayoutManager(getActivity());
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        //dividerItemDecoration = new DividerItemDecoration(hList.getContext(), linearLayoutManager.getOrientation());

        hList.setHasFixedSize(true);
        hList.setLayoutManager(linearLayoutManager);
        //hList.addItemDecoration(dividerItemDecoration);
        hList.setAdapter(adapter);
    // Get the application context
        //mContext = getContext();
        mActivity = getActivity();
        getData();
        return healthFragmentUI;
    }

请帮助我

3 个答案:

答案 0 :(得分:1)

您正在将上下文分配给上下文对象,然后使用mContext

Intent intent = new Intent(mContext, HealthDetailsActivity.class);

在此处将mContext更改为上下文

与以下内容相同:

mContext.startActivity(intent);

答案 1 :(得分:0)

您应该定义一个上下文并删除另一个

private Context context;

private Context mContext;

答案 2 :(得分:-1)

更改适配器构造函数。

public HealthAdapter(Context context, List<Health> list) {
   this.mContext = context;
   this.list = list;
}