2014-12-13 86 views
1

我是新來的android,我試過很多解決方案,但沒有任何作品!ArrayAdapter getView返回NullPointerException -

能否請你看看有什麼錯我的代碼:

holder.CardContent.setText(card.getString("content"));

得到NullPointerException我試圖從null改變layoutInflaterparentfalse ID是不假的!

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 2014-12-13 18:09:48

回答

0

您需要設置convertView的標籤到holderif - 塊。

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

感謝的人;)我是缺少的。 – 2014-12-13 18:15:15

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不爲null,則只是初始化持有者對象而不是cardContent。
  • mCards.get(position);返回null
1

問題是holdernull至少在一開始。 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(持有人);應該在@Mike M – 2014-12-13 18:28:24

+0

提到的if-block內部它可能是!當它已經設置時,它是相當多餘的。我會改變它。 – madlymad 2014-12-13 18:33:39

相關問題