getView()의 TextView에 대한 Null 개체 참조
-
20-12-2019 - |
문제
내 어댑터 코드는 다음과 같습니다.~을 위해 명심하세요 ListView
두 가지 유형의 보기를 반환합니다.(LogCat
코드 아래`)
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;
}
}
여기 나의 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
로깅을 통해 null임을 확인했습니다. TextView
에 있습니다 rowType
0.다음과 같은 경우에는 null입니다. convertView is NOT
null(따라서 뷰를 재활용할 때 발생함)
해결책
한 번 비슷한 문제가있었습니다. 각 레이아웃에 대해 별도의 리뷰자를 생성하여 해결했습니다.
@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;
}
.
뷰백 자료 :
static class ViewHolder {
TextView t1;
TextView t3;
TextView t4;
TextView t6;
}
static class ViewHolder2 {
TextView t2;
}
. 다른 팁
당신은 rowType
~이다 1
(디버그를 통해) 그러나 null은 내부에 나타납니다. If statement
어디에 rowType
~이다 0
(당신은 그것을 나타내는 If의 첫 번째 줄에 주석이 있습니다).
초기화되기 전에 TextView에 텍스트를 설정해야합니다
제휴하지 않습니다 StackOverflow