【问题标题】:Error while invoking android.widget.ListView.setAdapter(android.widget.ListAdapter) [duplicate]调用 android.widget.ListView.setAdapter(android.widget.ListAdapter) 时出错 [重复]
【发布时间】:2019-05-15 19:14:52
【问题描述】:

我对 android 很陌生,我正在尝试创建一个带有文本和图片的 listView 并将其放入片段中。我为我的列表创建了适配器,但是当我尝试设置此适配器时,出现以下错误。如果有人能帮助我找到解决这个问题的方法,我会很高兴。

Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference

这是我的这个片段的代码

package com.example.gymshark;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.example.gymprogress.R;

public class NotificationFragment extends Fragment {

    ListView listView;
    String mTitle[] = {"Drink water", "Creatine"};
    String mDescription[] = {"Water", "Creatine"};

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        listView = (ListView)view.findViewById(R.id.listView);

        MyAdapter adapter = new MyAdapter(getActivity(), mTitle, mDescription);
        listView.setAdapter(adapter);

    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        return inflater.inflate(R.layout.row_notification, container, false);

    }

    class MyAdapter extends ArrayAdapter<String>
    {
        Context context;
        String rTitle[];
        String rDescription[];

        MyAdapter (Context c, String[] title, String[] description)
        {
            super(c, R.layout.row_notification, R.id.text1, title);
            this.context = c;
            this.rTitle = title;
            this.rDescription = description;
        }

        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            LayoutInflater layoutInflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View row = layoutInflater.inflate(R.layout.row_notification, parent, false);
            TextView myTitle = row.findViewById(R.id.text1);
            TextView myDescription = row.findViewById(R.id.text2);

            myTitle.setText(rTitle[position]);
            myDescription.setText(rDescription[position]);

            return row;
        }
    }
}

【问题讨论】:

标签: java android


【解决方案1】:

首先,检查您的 XML 是否存在具有“listView”ID 的可用 ListView。

@Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        MyAdapter adapter = new MyAdapter(getActivity(), mTitle, mDescription);
        listView.setAdapter(adapter);

    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view=inflater.inflate(R.layout.row_notification, container, false);
        this.listView = (ListView)view.findViewById(R.id.listView);
        return view;
    }

【讨论】:

    【解决方案2】:

    将 onViewCreated 中的代码复制到 onActivityCreated

    而不是

        @Override
        public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            listView = (ListView)view.findViewById(R.id.listView);
    
            MyAdapter adapter = new MyAdapter(getActivity(), mTitle, mDescription);
            listView.setAdapter(adapter);
    
        }
    

    使用这个

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        listView = (ListView)view.findViewById(R.id.listView);
    
        MyAdapter adapter = new MyAdapter(getActivity(), mTitle, mDescription);
        listView.setAdapter(adapter);
    }
    

    【讨论】:

      【解决方案3】:

      问题

      @Nullable
      @Override
      public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
          return inflater.inflate(R.layout.row_notification, container, false);
      }
      

      你使用了错误的布局文件,所以使用你的片段布局文件而不是row_notification

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-12
        • 1970-01-01
        • 1970-01-01
        • 2016-08-26
        • 2016-06-09
        • 2019-07-18
        相关资源
        最近更新 更多