2012-01-15 60 views
0

我試圖使用教程,我發現here使從一個ArrayList列表視圖。這些行可以是團隊名稱或玩家名稱。現在它工作得很好,當我向下滾動,而是給出了一個空指針,當我向後滾動起來,這通常是因爲這與一個名字相關聯的行正試圖設置的隊名的TextView,反之亦然(我確定這從我的日誌語句) 。防爆。 isPlayerName設置爲true的視圖在我設置viewholder.player_name的行上給出了一個空指針。我認爲這與getTag()方法沒有引用正確的對象有關。當我僅使用播放器行時,該教程運行良好(可能是因爲所有的視圖持有者對象都是不穩定的)。這裏是我的listadapter: 私有類CustomAdapter延伸BaseAdapter {列表視圖填充ArrayList的空指針

private ArrayList<ArrayList<String>> player_array; 
    private LayoutInflater inflater; 

    public CustomAdapter(Context context, ArrayList<ArrayList<String>> array){ 
     player_array = array; 
     inflater = LayoutInflater.from(context); 
    } 

    @Override 
    public int getCount() { 
     return player_array.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return player_array.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder viewholder= new ViewHolder(); 
     boolean isPlayerName = (player_array.get(position).size() > 1 ? true : false); 
     if (convertView == null){ 
     if (isPlayerName){ 
      convertView = inflater.inflate(R.layout.player_list_item, null); 
      viewholder.player_name = (TextView)convertView.findViewById(R.id.player_name); 
      viewholder.layout = (RelativeLayout)convertView.findViewById(R.id.player_list_item_layout); 
     } 
     else { 
      convertView = inflater.inflate(R.layout.team_item, null); 
      viewholder.team_icon = (ImageView)convertView.findViewById(R.id.team_logo); 
      viewholder.team_name = (TextView)convertView.findViewById(R.id.team_name); 
     } 
     convertView.setTag(viewholder); 
     } 
     else { 
      viewholder = (ViewHolder)convertView.getTag(); 
     } 
     if (isPlayerName){ 
      try { 
       viewholder.player_name.setText((player_array.get(position)).get(0)); 
       viewholder.layout.setOnClickListener(new CustomOnClickListener(player_array.get(position).get(1))); 
      } 
      catch (NullPointerException e){ 
       Log.d("NULL", "is viewholder null? " + (viewholder == null)); 
       Log.d("NULL", "is player name? " + isPlayerName); 
       Log.d("NULL", "is getTag null? " + (convertView.getTag() == null)); 
       Log.d("NULL", "is team name null " + (viewholder.team_name == null)); 
       Log.d("NULL", "is team icon null " + (viewholder.team_icon == null)); 
       Log.d("NULL", "is player name null " + (viewholder.player_name == null)); 
       Log.d("NULL", "is link null? " + (player_array.get(position).get(1) == null)); 
       Log.d("NULL", "is layout null? " + (viewholder.layout == null)); 
      } 

     } 
     else { 
      String team_name = player_array.get(position).get(0); 
      try { 
      viewholder.team_name.setText(Character.toUpperCase(team_name.charAt(0)) + team_name.substring(1)); 
      } 
      catch (NullPointerException e){ 
       Log.d("NULL", "is player name? " + isPlayerName); 
       Log.d("NULL", "is getTag null? " + (convertView.getTag() == null)); 
       Log.d("NULL", "is team name null " + (viewholder.team_name == null)); 
       Log.d("NULL", "is team icon null " + (viewholder.team_icon == null)); 
       Log.d("NULL", "is player name null " + (viewholder.player_name == null)); 
      } 
      if (team_name.equals("hawks")){ 
       viewholder.team_icon.setBackgroundResource(R.drawable.hawks); 
      } 
      else if (team_name.equals("lions")){ 
       viewholder.team_icon.setBackgroundResource(R.drawable.lions); 
      } 
      else if (team_name.equals("sparks")){ 
       viewholder.team_icon.setBackgroundResource(R.drawable.sparks); 
      } 
      else if (team_name.equals("bulls")){ 
       viewholder.team_icon.setBackgroundResource(R.drawable.bulls); 
      } 
      else if (team_name.equals("renegades")){ 
       viewholder.team_icon.setBackgroundResource(R.drawable.renegades); 
      } 
      else if (team_name.equals("poppiezz")){ 
       viewholder.team_icon.setBackgroundResource(R.drawable.poppiezz); 
      } 
      else if (team_name.equals("mambas")){ 
       viewholder.team_icon.setBackgroundResource(R.drawable.mambas); 
      } 
      else if (team_name.equals("78sixers")){ 
       viewholder.team_icon.setBackgroundResource(R.drawable.sixers); 
      } 
      else if (team_name.equals("brooklynites")){ 
       viewholder.team_icon.setBackgroundResource(R.drawable.brooklynites); 
      } 
      else if (team_name.equals("blazers")){ 
       viewholder.team_icon.setBackgroundResource(R.drawable.blazers); 
      } 
      else if (team_name.equals("warriors")){ 
       viewholder.team_icon.setBackgroundResource(R.drawable.warriors); 
      } 
      else { 
       viewholder.team_icon.setBackgroundResource(R.drawable.basketball); 
      } 
     } 
     return convertView; 
    } 

} 

這裏是我的viewHolder,我用的是同一對兩種類型的行,但只有某些領域實例化取決於它是否是一個團隊或玩家排

private class ViewHolder { 

    ImageView team_icon; 
    TextView player_name; 
    RelativeLayout layout; 
    TextView team_name; 
} 

是因爲我不理解getTag()方法嗎?

回答

1

凱文,

根據你的代碼,你似乎是理解getTag()setTag()正確。爲以防萬一,讓我打破它給你:

「標籤」是連接到另一對象(任何對象)。它沒有類型特定的配對,但通常用於將數據對象(如viewHolder)與非數據對象(如View)配對。不幸的是,這意味着如果使用「標籤」,則必須進行自己的類型檢查。

最常見的問題與「標籤」,是許多開發商搶錯觀的「標籤」,因此,得到錯誤的,甚至空數據。這似乎不是你的代碼的情況。但是,您擁有所有Log.d()陳述。如果我們擁有logcat的副本,我們肯定能夠更輕鬆地爲您提供幫助。 眼色眉來眼去

希望這有助於

FuzzicalLogic

+0

啊這或許可以解釋它。所以基本上配對不是哈希映射的配對嗎? – 2012-01-15 05:51:58

+0

它可以像這樣使用,但它確實不是。多個對象可能具有相同的標籤。一個給定的對象甚至可能有多個標籤(分配類似於散列表)。從本質上講,如果你保持一個標籤到一個視圖比例...是的,它可以是一個散列表。但它沒有Hashmap Type保護。 – 2012-01-15 06:01:32

+0

我想到這一點,只是決定使用通用viewholder避免空的錯誤,因爲我以前的方式可能心不是值得的努力來解決。謝謝你的解釋,但我會積極解決我的困惑。 – 2012-01-15 06:14:05