2016-01-28 2 views
0

Это демонстрационный код, и когда я добавляю onClickListener в функцию заполнения, он не работает, и если я устанавливаю любое другое свойство, например, цвет фона, он отлично работает.кнопка не отвечает

private void fillHolder(FriendsHolder holder, final Friend friend) { 
     if (friend == null) 
      return; 
     Iterator<Button> iViews = holder.interests.iterator(); 
     Iterator<String> iInterests = friend.getInterests().iterator(); 
     while (iViews.hasNext() && iInterests.hasNext()) { 
      iViews.next().setText(iInterests.next()); 
     } 
     Iterator<Button> iViewss = holder.interests.iterator(); 
     while (iViewss.hasNext()) { 
      iViewss.next().setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Toast.makeText(getActivity(), friend.getNickname(), Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
     holder.infoPage.setBackgroundColor(getResources().getColor(friend.getBackground())); 
     holder.nickName.setText(friend.getNickname()); 

    } 
} 
+0

Пожалуйста, разместите свой logcat –

+0

@ g2o Где?, SO не разрешает мне редактировать вопрос. – hemant3370

+0

Опубликовать его как комментарий. – GAntoine

ответ

1

Вы перебор iViewss (с двойным S в конце концов), и вы настраиваете слушатель iViews (с одной S в конце концов).

Это не тот же объект.

iViews.next().setOnClickListener() будет вызывать NoSuchElementException, потому что нет следующего элемента.

Изменить код так:

private void fillHolder(FriendsHolder holder, final Friend friend) { 
     if (friend == null) 
      return; 
     Iterator<Button> iViews = holder.interests.iterator(); 
     Iterator<String> iInterests = friend.getInterests().iterator(); 
     while (iViews.hasNext() && iInterests.hasNext()) { 
      iViews.next().setText(iInterests.next()); 
     } 
     while (iViews.hasNext()) { 
      iViews.next().setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Toast.makeText(getActivity(), friend.getNickname(), Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
     holder.infoPage.setBackgroundColor(getResources().getColor(friend.getBackground())); 
     holder.nickName.setText(friend.getNickname()); 

} 

EDIT:

Вы можете также комбинировать циклы While-два (как cricket_007 предложение):

private void fillHolder(FriendsHolder holder, final Friend friend) { 

      if (friend == null) 
       return; 

      Iterator<Button> iViews = holder.interests.iterator(); 
      Iterator<String> iInterests = friend.getInterests().iterator(); 

      while (iViews.hasNext()) { 

       Button button = iViews.next(); 

       if (iInterests.hasNext()) { 
        button.setText(iInterests.next()); 
       } 

       button.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         Toast.makeText(getActivity(), friend.getNickname(), Toast.LENGTH_SHORT).show(); 
        } 
       }); 
      } 

      holder.infoPage.setBackgroundColor(getResources().getColor(friend.getBackground())); 
      holder.nickName.setText(friend.getNickname()); 

    } 
+0

Не могли бы вы объединить while-loops, чтобы делать setText и setOnClickListener в том же цикле? В противном случае, похоже, что OP пытался сбросить итератор для 'setOnClickListener' –

+0

@ cricket_007 Да! Вы имеете право. Благодаря! – Rami

+0

Итак, вы просто скопировали мой ответ? :) Хорошо –

0

Наряду с комментарии из другого ответа, я думаю, что этот код более уместен - похоже, вы можете комбинировать while-loops.

private void fillHolder(FriendsHolder holder, final Friend friend) { 
    if (friend == null) 
     return; 
    Iterator<Button> iViews = holder.interests.iterator(); 
    Iterator<String> iInterests = friend.getInterests().iterator(); 
    while (iViews.hasNext()) { 
     Button nextButton = iViews.next(); 
     if (iInterests.hasNext()) { 
      nextButton.setText(iInterests.next()); 
     } 
     nextButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(getActivity(), friend.getNickname(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

    holder.infoPage.setBackgroundColor(getResources().getColor(friend.getBackground())); 
    holder.nickName.setText(friend.getNickname()); 

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