上下文显示自定义适配器类中的空指针异常?

时间:2017-01-19 06:04:35

标签: java android

我正在使用自定义适配器创建ListView 在客户适配器类中,我将Context对象传递给它的超类,并在为Adapter类创建对象时将Context对象传递给MainActivity

显示以下错误

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mylistpractice/com.mylistpractice.MainActivity}: 
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference

现在我从getApplicationContext()传递参数时传递Context而不是MainActivity对象,但它没有显示任何错误。

我对传递Context对象和传递getApplicationContext()之间的区别感到困惑。

但它没有在ListView中显示任何数据。

这是Adapter类

public class Myadapter extends ArrayAdapter<Data> {
ArrayList<Data> arraydata;
Context context;

public Myadapter(ArrayList<Data> arraydata,Context context) {
    super(context,R.layout.content,arraydata);
    this.arraydata=arraydata;
    this.context=context;
}

@Override
public int getCount() {
    return 0;
}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Data data=getItem(position);
    Viewholder viewholder;
    View vi=convertView;

    if(vi==null) {
        viewholder=new Viewholder();
        LayoutInflater inflater = LayoutInflater.from(getContext());
        vi = inflater.inflate(R.layout.content, parent, false);
        viewholder.name=(TextView)vi.findViewById(R.id.name);
        viewholder.id=(TextView)vi.findViewById(R.id.id);
        vi.setTag(viewholder);
    } else {
        viewholder=(Viewholder)vi.getTag();
    }
     viewholder.name.setText(data.getName());
     viewholder.id.setText(data.getId());
     return vi;
}

public class Viewholder {
    TextView id;
    TextView name;
}
}

这是我的MainActivity

public class MainActivity extends AppCompatActivity {
    ListView list;
    ArrayList<Data> arraydata=new ArrayList<>();
    Myadapter myadapter;
    Context context;
    Data data;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        list=(ListView)findViewById(R.id.list);
        setList();
        myadapter = new Myadapter(arraydata,MainActivity.this);
        list.setAdapter(myadapter);
    }

    public void setList() {

        for(int i=0;i<15;i++) { 
             String s,id;
             data = new Data();
             data.setName("Farhana:::"+i);
             s = data.getName();
             data.setId("Id:::"+i);
             id = data.getId();
             arraydata.add(data);
             Log.e("DAtA:--",s);
             Log.e("ID:--",id);
        }
    }
}

2 个答案:

答案 0 :(得分:3)

  

但未在listview中显示任何数据

因为你告诉它不要创建任何视图。

@Override
public int getCount() {
    return 0;
}

您正在使用ArrayAdapter。您不需要实施getCount,但如果这样做,请返回列表的大小

@Override
public int getCount() {
    return arraydata == null ? 0 : arraydata.size();
}

无论如何,关于你的问题,倾向于像你为上下文(活动是上下文)那样使用MainActivity.this

如果您的错误在这里

LayoutInflater inflater = LayoutInflater.from(getContext());

然后,那可能是

LayoutInflater inflater = LayoutInflater.from(this.context);

你从构造函数

获得了上下文

答案 1 :(得分:1)

你重写方法getCount();它返回零,你必须返回数组列表的大小。