上下文显示自定义适配器类中的空指针异常?(Context showing null pointer Exception in Custom Adapter class?)

编程入门 行业动态 更新时间:2024-10-28 10:22:44
上下文显示自定义适配器类中的空指针异常?(Context showing null pointer Exception in Custom Adapter class?)

我正在创建一个带有自定义适配器的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

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

我对传递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); } } }

I'm creating a ListView with a custom adapter. In the customer adapter class, I'm passing a Context object to its super class and also passing a Context object to the MainActivity while creating the object for the Adapter class.

It shows the following error

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

Now I pass getApplicationContext() rather than the Context object while passing the argument from MainActivity and it doesn't show any error.

I am confused about the difference between passing a Context object and passing getApplicationContext().

But it's not showing any data in the ListView.

This is the Adapter class

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; } }

this is my 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); } } }

最满意答案

但没有在listview中显示任何数据

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

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

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

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

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

如果您的错误在这里

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

然后,这可能是

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

你从构造函数中获取了上下文

but not showing anydata in listview

Because you told it not to create any views.

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

You are using an ArrayAdapter. You don't need to implement getCount, but if you do, return the size of the list

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

Anyways, regarding your question, tend to use MainActivity.this like you have done for the Context (Activities are Contexts).

If your error is here

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

Then, that could instead be

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

which you got the context from the constructor

更多推荐

本文发布于:2023-08-07 06:09:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1462560.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:上下文   自定义   适配器   指针   类中

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!