2012-01-15 2 views
0

Я пытаюсь сделать listview у arraylist, используя учебник, который я нашел here. Строки могут быть либо именем команды, либо именем игрока. Прямо сейчас он отлично работает, когда я прокручиваю вниз, но дает нулевой указатель, когда я просматриваю резервную копию, обычно потому, что строка, связанная с именем, пытается установить текстовое представление имени команды или наоборот (я определил это из своих операторов журнала) , Ex. представление с isPlayerName, установленное в true, дает нулевой указатель на строке, где я устанавливаю viewholder.player_name. Я думаю, что это имеет какое-то отношение к методу getTag(), не ссылающемуся на правильный объект. Учебник отлично работал, когда я использовал только строки игроков (возможно, потому, что все объекты зрителей были установлены). Вот мой listadapter: частный класс CustomAdapter расширяет BaseAdapter {Listview заполняется с помощью ArrayList nullpointer

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() правильно. На всякий случай, позвольте мне разбить его для вас:

«Тег» - это объект (любой объект), который прикреплен к другому. Он не имеет определенного типа спаривания, но часто он используется для сопряжения данных-объектов (например, вашего объекта просмотра) с объектами без данных (например, с представлением). К сожалению, это означает, что если вы используете «тег», вы должны сделать свой собственный тип проверки.

Наиболее распространенная проблема с «тегами» заключается в том, что многие разработчики захватывают «тег» неправильного представления и, следовательно, получают неправильные или даже нулевые данные. Это не похоже на ваш код. Однако у вас есть все заявления Log.d(). Мы, несомненно, сможем помочь вам легче, если бы у нас была копия этого логарифма. подмигивания подмигивания подталкивать подталкивать

Надеются, что это помогает,

FuzzicalLogic

+0

ах, которые могли бы объяснить это. поэтому в основном спаривание не похоже на спаривание для хэш-карты? –

+0

Его можно использовать так, но это действительно так. Несколько объектов могут иметь один и тот же тег. У данного объекта может быть даже несколько меток (назначенных аналогично хэш-карте). В сущности, если вы поддерживаете отношение одного тега к одному виду ... да, это может быть хэш-карта. Но у него нет защиты типа Hashmap. –

+0

Я немного подумал об этом и решил использовать универсальный зритель, чтобы избежать нулевых ошибок, так как мой предыдущий способ, вероятно, не стоит усилий для исправления. спасибо за объяснение, хотя, я буду поддерживать, чтобы очистить мое замешательство. –

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