Référence d'objet nul sur TextView dans getView()
-
20-12-2019 - |
Question
Voici mon code d'adaptateur ;garder à l'esprit pour le ListView
Je renvoie deux types de vues.(LogCat
sous le code`)
public class ItemAdapter extends ArrayAdapter<Item> {
private LayoutInflater inflater;
public ItemAdapter(Context context, ArrayList<Item> userItemObjectList) {
super(context, R.layout.item_row_layout, userItemObjectList);
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getViewTypeCount() {
return 2;
}
class ViewHolder {
TextView t1;
TextView t2;
TextView t3;
TextView t4;
TextView t6;
}
@Override
public int getItemViewType(int pos) {
Item i = getItem(pos);
String season = i.season;
if (!season.equals(lastSeason)) {
return 1;
} else {
return 0;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
int rowType = getItemViewType(position);
if (convertView == null) {
holder = new ViewHolder();
if (rowType == 0) {
convertView = inflater.inflate(R.layout.item_row_layout, parent,
false);
holder.t1 = (TextView) convertView.findViewById(R.id.itemName);
holder.t3 = (TextView) convertView
.findViewById(R.id.tvReviewTotalForItem);
holder.t4 = (TextView) convertView
.findViewById(R.id.tvPercentageItems);
holder.t6 = (TextView) convertView
.findViewById(R.id.tvItemRowReviewLabel);
convertView.setTag(holder);
} else if (rowType == 1) {
convertView = inflater.inflate(R.layout.row_season, parent,
false);
holder.t2 = (TextView) convertView.findViewById(R.id.seasonNumber);
convertView.setTag(holder);
}
} else {
holder = (ViewHolder) convertView.getTag();
}
Item i = getItem(position);
String episode = i.item;
String rating = i.ratings;
String review = i.reviews;
if (rowType == 1) {
String season = i.season;
lastSeason = season;
holder.t2.setText("Season " + lastSeason);
} else if (rowType == 0) {
holder.t1.setText(episode); // THIS IS WHERE NULL TEXTVIEW IS FOUND
holder.t3.setText(review);
holder.t4.setText(rating);
holder.t4.setText(rating);
}
return convertView;
}
}
Voici mon LogCat
:
07-28 09:50:02.689: E/AndroidRuntime(7685): Process: com.---.---, PID: 7685
07-28 09:50:02.689: E/AndroidRuntime(7685): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
07-28 09:50:02.689: E/AndroidRuntime(7685): at com.---.---.ItemAdapter.getView(ItemAdapter.java:181)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:220)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.widget.AbsListView.obtainView(AbsListView.java:2255)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.widget.ListView.makeAndAddView(ListView.java:1790)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.widget.ListView.fillDown(ListView.java:691)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.widget.ListView.fillGap(ListView.java:655)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5143)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3243)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.widget.AbsListView.onTouchMove(AbsListView.java:3587)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.widget.AbsListView.onTouchEvent(AbsListView.java:3431)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.View.dispatchTouchEvent(View.java:7706)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
07-28 09:50:02.689: E/AndroidRuntime(7685): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
07-28 09:50:02.689: E/AndroidRuntime(7685): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.app.Activity.dispatchTouchEvent(Activity.java:2458)
07-28 09:50:02.689: E/AndroidRuntime(7685): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.View.dispatchPointerEvent(View.java:7886)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3947)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3518)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3575)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5532)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5512)
07-28 09:50:02.689: E/AndroidRuntime(7685): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:548
J'ai confirmé, grâce à la journalisation, que le null TextView
est dans rowType
0.Il est nul quand convertView is NOT
null (c'est ce qui se produit lorsqu'il recycle les vues).
La solution
J'ai eu une fois un problème similaire, je l'ai résolu en créant des ViewHolders distincts pour chaque mise en page :
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
ViewHolder2 holder2;
int rowType = getItemViewType(position);
if (convertView == null) {
if (rowType == 0) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.item_row_layout, parent,
false);
holder.t1 = (TextView) convertView.findViewById(R.id.itemName);
holder.t3 = (TextView) convertView
.findViewById(R.id.tvReviewTotalForItem);
holder.t4 = (TextView) convertView
.findViewById(R.id.tvPercentageItems);
holder.t6 = (TextView) convertView
.findViewById(R.id.tvItemRowReviewLabel);
convertView.setTag(holder, R.layout.item_row_layout);
} else if (rowType == 1) {
holder2 = new ViewHolder2();
convertView = inflater.inflate(R.layout.row_season, parent,
false);
holder2.t2 = (TextView) convertView.findViewById(R.id.seasonNumber);
convertView.setTag(holder, R.layout.row_season);
}
} else {
if (rowType == 0) {
holder = (ViewHolder) convertView.getTag(R.layout.item_row_layout);
} else if (rowType == 1) {
holder2 = (ViewHolder2) convertView.getTag(R.layout.row_season);
}
}
Item i = getItem(position);
String episode = i.item;
String rating = i.ratings;
String review = i.reviews;
if (rowType == 1) {
String season = i.season;
lastSeason = season;
holder2.t2.setText("Season " + lastSeason);
} else if (rowType == 0) {
holder.t1.setText(episode); // THIS IS WHERE NULL TEXTVIEW IS FOUND
holder.t3.setText(review);
holder.t4.setText(rating);
holder.t4.setText(rating);
}
return convertView;
}
Spectateurs :
static class ViewHolder {
TextView t1;
TextView t3;
TextView t4;
TextView t6;
}
static class ViewHolder2 {
TextView t2;
}
Autres conseils
Vous avez dit que le rowType
est 1
(via le débogage) mais le nul apparaît à l'intérieur du If statement
où le rowType
est 0
(vous avez un commentaire dans la première ligne de celui-ci si vous l'indiquez).
vous devez avoir défini le texte sur textView avant qu'il ne soit initialisé