2016-06-27 2 views
1

У меня есть следующий код, и я получаю исключение из null-указателя (см. Ниже). Я хочу получить имя пользователя, на которое указывает держатель вида. Я попытался даже получить его через view (v), но у меня получилось такое же исключение. Я не понимаю, почему значение равно null.Ссылка на нулевой указатель от адаптера setOnClickListener

public class ContactAdapter extends BaseAdapter { 

     private Context mContext; 


     public ContactAdapter(Context context) { 

      mContext = context; 
     } 


     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      ViewHolder holder; 

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

      } else { 

       holder = (ViewHolder) convertView.getTag(); 
      } 

    holder.delete.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        try { 
         ViewHolder vv = (ViewHolder)v.getTag(); 
         TextView tv = (TextView) vv.userName.getText(); // Exception here - Line 120 
        }catch(Exception xx){ 

        } 
       } 
    }); 
} 

    private class ViewHolder { 

      TextView userName; 
      ImageView add, delete, block,profImage; 

      public ViewHolder(View view) { 

       userName = (TextView) view.findViewById(R.id.user_name); 
       add = (ImageView) view.findViewById(R.id.add); 
       delete = (ImageView) view.findViewById(R.id.delete); 
       block = (ImageView) view.findViewById(R.id.block); 
       profImage = (ImageView) view.findViewById(R.id.profile_image); 
      } 
     } 

Вот исключение: enter image description here

+0

Я думаю, вы должны сначала SetTag. holder.delete.setTag (держатель); – Ani

+0

В этом _ViewHolder vv = (ViewHolder) v.getTag(); _ u r get tag для кнопки удаления _v.getTag() _ и u не установил тег для кнопки удаления, так что получаю NPE. – Piyush

ответ

0
view.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        ViewHolder vv = (ViewHolder)v.getTag(); 
        TextView tv = (TextView) vv.userName.getText(); 
       }catch(Exception xx){ 

       } 
      } 
}); 

вы пробовали это внутри конструктора viewholder ... Я думаю, вы получаете исключения нулевого указателя, потому что вы устанавливаете на щелчок на держателе у слушателя. delete

0

Заменить 'Держатель для держателя View; «конечным владельцем ViewHolder»; и в методе OnClick, просто доступ мнения, делая 'holder.userName.getText() и т.д. ...

+0

Прохладный - это работает. – kingchuck

+0

Мое удовольствие! Если на ваш вопрос ответили, пожалуйста, примите его. – user3793589

0
holder.delete.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        ViewHolder vv = (ViewHolder)v.getTag(); 
        TextView tv = (TextView) vv.userName.getText(); // Exception here - Line 120 
       }catch(Exception xx){ 

       } 
      } 
}); 

Вы можете установить тег для convertView, но вы getTag() от ребенка convertView. так что это будет null

Чтобы это исправить:

  1. Изменение ViewHolder окончательного

    конечного держателя ViewHolder;

  2. получить текст непосредственно из вашего держателя

    holder.delete.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
           try { 
            TextView tv = (TextView) holder.userName.getText(); 
           }catch(Exception xx){ 
    
           } 
          } 
    }); 
    
+0

Спасибо. Это работает! – kingchuck

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