Я пытаюсь сделать 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()?
ах, которые могли бы объяснить это. поэтому в основном спаривание не похоже на спаривание для хэш-карты? –
Его можно использовать так, но это действительно так. Несколько объектов могут иметь один и тот же тег. У данного объекта может быть даже несколько меток (назначенных аналогично хэш-карте). В сущности, если вы поддерживаете отношение одного тега к одному виду ... да, это может быть хэш-карта. Но у него нет защиты типа Hashmap. –
Я немного подумал об этом и решил использовать универсальный зритель, чтобы избежать нулевых ошибок, так как мой предыдущий способ, вероятно, не стоит усилий для исправления. спасибо за объяснение, хотя, я буду поддерживать, чтобы очистить мое замешательство. –