Pregunta

Aquí está mi adaptador código;tener en cuenta para la ListView Estoy de vuelta en dos tipos de vistas.(LogCat bajo el código`)

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;
}

}

Aquí está mi 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

Me han confirmado, a través del registro, que el valor null TextView es en rowType 0.Es nula cuando convertView is NOT null (así sucede cuando es el reciclaje de los puntos de vista).

¿Fue útil?

Solución

Una vez tuve un problema similar, lo resuelto por la creación de separar ViewHolders para cada presentación:

    @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;
}

Viewholders:

static class ViewHolder {
    TextView t1;
    TextView t3;
    TextView t4;
    TextView t6;
}

static class ViewHolder2 {
    TextView t2;
}

Otros consejos

Usted dijo que el rowType es 1 (a través de la depuración), pero el nulo aparece en el interior de la If statement donde el rowType es 0 (usted tiene un comentario en la primera línea de que Si indica es).

debe haber configurado el texto a textView antes de iniciar la

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top