按钮单击无响应

时间:2016-01-28 17:41:45

标签: java android listview onclicklistener

这是演示代码,当我在fill函数中添加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());

    }
}

2 个答案:

答案 0 :(得分: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());

 }

修改

您还可以将两个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());

     }

答案 1 :(得分:0)

除了其他答案的评论之外,我认为这段代码更合适 - 看起来你可以结合while循环。

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());

 }