Riferimento dell'oggetto null su TextView in GetView ()
-
20-12-2019 - |
Domanda
Ecco il mio codice adattatore;Tieni presente per il ListView
che sto restituendo due tipi di viste.
(LogCat
sotto il codice`)
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;
}
.
}
Ecco il mio 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
.
Ho confermato, attraverso la registrazione, che il TextView
NULL è in rowType
0. È nullo quando convertView is NOT
Null (quindi succede quando si ricicla le viste).
Soluzione
Ho avuto un una volta un problema simile, l'ho risolto creando gli esperti separati per ogni layout:
@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;
}
.
Aspettitori:
static class ViewHolder {
TextView t1;
TextView t3;
TextView t4;
TextView t6;
}
static class ViewHolder2 {
TextView t2;
}
. Altri suggerimenti
Hai detto che il rowType
è 1
(attraverso il debug) ma il null appare all'interno del If statement
in cui il rowType
è 0
(si ha un commento nella prima riga di questo se lo indica).
È necessario impostare il testo su TextVisualizza prima che sia stato inizializzato