2014-12-13 2 views
1

Я новичок в android, я пробовал много решений, но ничего не работает!ArrayAdapter getView возвращает NullPointerException -

Вы можете увидеть, пожалуйста, что случилось с моим кодом:

я NullPointerException в holder.CardContent.setText(card.getString("content"));

Я попытался изменить layoutInflater от null к parent, false Идентификаторы не фальшивый один!

CardAdapter.java

public class CardAdapter extends ArrayAdapter<ParseObject> { 
    protected Context mContext; 
    protected List<ParseObject> mCards; 

    public CardAdapter(Context context, List<ParseObject> cards) { 
     super(context, R.layout.card_item, cards); 

     mContext = context; 
     mCards = cards; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if(convertView == null) { 
      convertView = LayoutInflater.from(mContext).inflate(R.layout.card_item, null); 
      holder = new ViewHolder(); 

      holder.CardContent = (TextView) convertView.findViewById(R.id.cardText); 
     } else{ 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     ParseObject card = mCards.get(position); 

     holder.CardContent.setText(card.getString("content")); // <-- NPE here. 

     return convertView; 
    } 

    private static class ViewHolder{ 
     TextView CardContent; 
    } 
} 

Logcat:

at com.kardapps.lifehacks.activities.CardAdapter.getView(CardAdapter.java:64) 
at android.widget.AbsListView.obtainView(AbsListView.java:2255) 
at android.widget.ListView.measureHeightOfChildren(ListView.java:1263) 
at android.widget.ListView.onMeasure(ListView.java:1175) 
....... 
+0

@NamelessOne ваши ссылки не имеют никакого – madlymad

ответ

0

Вы должны установить тег convertView «s к holder в вашем if -блоком.

if (convertView == null) 
{ 
    convertView = LayoutInflater.from(mContext).inflate(R.layout.card_item, null); 
    holder = new ViewHolder(); 

    holder.CardContent = (TextView) convertView.findViewById(R.id.cardText); 

    // Add this line 
    convertView.setTag(holder); 
} 

Вы можете видеть, что в else -блоке, вы извлечение тегов и приведения его в ViewHolder. Если вы не установили тег, getTag() возвращает null, вызывая исключение.

+1

Благодаря человеку;) я пропускал это. –

0

Смотреть этот код:

if(convertView == null){ 
     convertView = LayoutInflater.from(mContext).inflate(R.layout.card_item, null); 
     holder = new ViewHolder(); 
     holder.CardContent = (TextView) convertView.findViewById(R.id.cardText); 
    } 
    else{ 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    ParseObject card = mCards.get(position); 
    holder.CardContent.setText(card.getString("content")); 

две возможности:

  • Если convertView не является нулевым, вы просто инициализируете объект-держатель, а не cardContent.
  • mCards.get(position); возвращает нулевое значение
1

Проблема в том, что holder является null хотя бы для начала. card может быть null тоже, но его непонятно в данный момент.

Несмотря на то, что логика утилизации адаптера права, вы забыли до setTag до View.

Логика утилизации заключается в том, что способ прокрутки вы сохраняете (используя setTag) уже прочитанные/просмотренные данные на вид (здесь convertView).

Тогда каждый раз, когда вы передаете ту же позицию, которую вы используете setTag, чтобы получить их вместо воссоздания их (LayoutInflater.from...)

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if(convertView == null) { 
     //      This is not an error but using parent you avoid Lint warnings 
     convertView = LayoutInflater.from(mContext).inflate(R.layout.card_item, parent); 
     holder = new ViewHolder(); 

     holder.CardContent = (TextView) convertView.findViewById(R.id.cardText); 
     convertView.setTag(holder); // <-- As suggested for improvement 
    } else{ 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    ParseObject card = mCards.get(position); 

    holder.CardContent.setText(card.getString("content")); // <-- NPE here. 

    // convertView.setTag(holder); // <-- This line is missing 
    return convertView; 
} 
+0

Я думаю, что convertView.setTag (держатель); должен быть внутри if-блока, как упомянуто @Mike M –

+0

Это может быть! Его довольно избыточный, чтобы установить его, когда он уже установлен. Я изменю его. – madlymad

Смежные вопросы