Java 设置setOnItemClickListener时ListView上的NullPointerException问题
我对空指针有问题:Java 设置setOnItemClickListener时ListView上的NullPointerException问题,java,android,Java,Android,我对空指针有问题: FATAL EXCEPTION: main java.lang.NullPointerException at com.irdes.adapter.PersonneAdapter.getView(PersonneAdapter.java:66) at android.widget.AbsListView.obtainView(AbsListView.java:1430) at android.widget.ListView.makeAndAddView(ListVi
FATAL EXCEPTION: main
java.lang.NullPointerException
at com.irdes.adapter.PersonneAdapter.getView(PersonneAdapter.java:66)
at android.widget.AbsListView.obtainView(AbsListView.java:1430)
at android.widget.ListView.makeAndAddView(ListView.java:1745)
at android.widget.ListView.fillDown(ListView.java:670)
at android.widget.ListView.fillFromTop(ListView.java:727)
at android.widget.ListView.layoutChildren(ListView.java:1598)
at android.widget.AbsListView.onLayout(AbsListView.java:1260)
at android.view.View.layout(View.java:7175)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
at android.view.View.layout(View.java:7175)
at android.widget.SlidingDrawer.onLayout(SlidingDrawer.java:331)
at android.view.View.layout(View.java:7175)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1243)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1049)
at android.view.View.layout(View.java:7175)
at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
at android.view.View.layout(View.java:7175)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:912)
at android.view.View.layout(View.java:7175)
at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
at android.view.View.layout(View.java:7175)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
at android.view.View.layout(View.java:7175)
at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
at android.view.View.layout(View.java:7175)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1140)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:3683)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
logcat指出的错误在我的类personneAdapter错误行在**之后:
[...]
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.affichagelistview, null);
//NB : j'ai réutilisé affichagelistview des actualités pour gagner du temps, et de la place
holder.nomPers = (TextView)convertView.findViewById(R.id.titreActu);
holder.descrPers = (TextView)convertView.findViewById(R.id.dateActu);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
** holder.nomPers.setText((pers.get(position)).getNom());
holder.descrPers.setText((pers.get(position)).getDescr());
return convertView;
}
public void initListDetailPersonne(ListView liste, int typeDetail, int num) {
[...]
PersonneAdapter adapter = new PersonneAdapter(context, listePersonnes);
liste.setAdapter(adapter);
liste.setTextFilterEnabled(true);
**liste.setOnItemClickListener(new OnItemClickListener() {
**public void onItemClick(AdapterView<?> a, View v, int position, long id) {
Personne pers = (Personne) a.getItemAtPosition(position);
Intent intent = new Intent(context,DetailActivity.class);
//NB : Le numéro correspond à typeUpdate, le code à l'Id de l'objet à récupérer
//L'envoi de l'objet entre deux activity est compliqué et couteux à mettre en place
//L'activity qui réceptionnera les données ira elle même dans la BDD interne
Bundle objetbunble = new Bundle();
objetbunble.putString("Classe", "2");
objetbunble.putString("Code", pers.getNum()+"");
// on passe notre objet a notre activities
intent.putExtras(objetbunble );
// on appelle notre activité
context.startActivity(intent);
}
});
但我发现了真正的问题错误在哪里,在这个代码行上,错误区域在**之后:
[...]
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.affichagelistview, null);
//NB : j'ai réutilisé affichagelistview des actualités pour gagner du temps, et de la place
holder.nomPers = (TextView)convertView.findViewById(R.id.titreActu);
holder.descrPers = (TextView)convertView.findViewById(R.id.dateActu);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
** holder.nomPers.setText((pers.get(position)).getNom());
holder.descrPers.setText((pers.get(position)).getDescr());
return convertView;
}
public void initListDetailPersonne(ListView liste, int typeDetail, int num) {
[...]
PersonneAdapter adapter = new PersonneAdapter(context, listePersonnes);
liste.setAdapter(adapter);
liste.setTextFilterEnabled(true);
**liste.setOnItemClickListener(new OnItemClickListener() {
**public void onItemClick(AdapterView<?> a, View v, int position, long id) {
Personne pers = (Personne) a.getItemAtPosition(position);
Intent intent = new Intent(context,DetailActivity.class);
//NB : Le numéro correspond à typeUpdate, le code à l'Id de l'objet à récupérer
//L'envoi de l'objet entre deux activity est compliqué et couteux à mettre en place
//L'activity qui réceptionnera les données ira elle même dans la BDD interne
Bundle objetbunble = new Bundle();
objetbunble.putString("Classe", "2");
objetbunble.putString("Code", pers.getNum()+"");
// on passe notre objet a notre activities
intent.putExtras(objetbunble );
// on appelle notre activité
context.startActivity(intent);
}
});
我在其他视图和适配器中使用了相同的代码,但只有此代码不适用于seminaire。何时触发错误?在单击列表项时,还是在显示列表视图时?至于LogCat,npe来自holder.nomPers.setText、pers.get或pers.getNom。如果它只是一个您想要存储的数字,您可以将其写入TextView的标记中。语法将是:
myPersNum = ((View)v.findViewById(R.id.titreActu)).getTag();
ypu确定在personneAdapter中实现了getItemAtPosition?吗?我拥有的每个适配器都是相同的,只是类型更改,在代码的其他部分,使用了personneAdapter,并且没有发现错误