문제

내 어댑터 코드는 다음과 같습니다.~을 위해 명심하세요 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에 텍스트를 설정해야합니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top