0

我正在开发一个带有照片的列表视图,在这张照片下方我有 1 个普通按钮和 1 个切换按钮。我希望这个切换按钮像一个赞按钮一样 - 如果我点击一个按钮,我会增加照片的当前赞数,如果我再次点击按钮,我会减少赞数。

这是此的代码:

private View.OnClickListener likeBtnClickListener = new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            if(likeBtn.isChecked())
            {
                likeBtn.setBackgroundDrawable(getContext().getResources().getDrawable(R.drawable.heart));
                likeBtn.setChecked(false);
                if(Integer.parseInt(likeBtn.getTextOff().toString())>0)
                {
                    likeBtn.setTextOff(String.valueOf(Integer.parseInt(likeBtn.getTextOn().toString())-1));
                }
                Log.e(String.valueOf(view.getTag()), "isChecked");
            }
            else
            {
                likeBtn.setBackgroundDrawable(getContext().getResources().getDrawable(R.drawable.heart_on));
                likeBtn.setChecked(true);
                likeBtn.setTextOn(String.valueOf(Integer.parseInt(likeBtn.getTextOff().toString())+1));
                Log.e(String.valueOf(view.getTag()), "!!isChecked");
            }
        }
    };

这是我的适配器的 getView 方法:

public View getView(int position, View convertView, ViewGroup parent)
    {
        View view = convertView;

        if(view == null)
        {
            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.photo_view_cell, null);
        }

        Photo dData = data.get(position);
        if(dData!=null)
        {
            ImageView profileImg = (ImageView) view.findViewById(R.id.profile_img);
            TextView username = (TextView) view.findViewById(R.id.name);
            ImageView photoImage = (ImageView) view.findViewById(R.id.image);
            TextView date = (TextView) view.findViewById(R.id.date);
            likeBtn = (ToggleButton) view.findViewById(R.id.likesBtn);
            ToggleButton commentBtn = (ToggleButton) view.findViewById(R.id.commentsBtn);

            int noLikes = dData.getNoLikes();
            if(noLikes>0)
            {
                likeBtn.setChecked(true);
                likeBtn.setBackgroundDrawable(getContext().getResources().getDrawable(R.drawable.heart_on));
                likeBtn.setTextOn(String.valueOf(noLikes));
                likeBtn.setTextOff(String.valueOf(noLikes));
            }
            else
            {
                likeBtn.setChecked(false);
                likeBtn.setBackgroundDrawable(getContext().getResources().getDrawable(R.drawable.heart));
                likeBtn.setTextOff("0");
                likeBtn.setTextOn("0");

            }
            likeBtn.setOnClickListener(likeBtnClickListener);
            username.setText(dData.getUser().getUsername());
            photoImage.setImageBitmap(dData.getImage());
            date.setText(dData.getDate());
        }

        view.setTag(position);
        return view;
    }

现在的问题是这个切换按钮不能正常工作。例如,现在我在主列表视图中有 3 张照片 - 在每张照片下方我有 1 个切换按钮和一个普通按钮。当我点击第二个按钮下方的切换按钮时 - 第一张照片下方的切换按钮激活 - 如果我点击下方的切换按钮或有时此切换按钮不起作用。

你能告诉我我做错了什么吗?

谢谢!

4

1 回答 1

1

看起来您已将 likeBtn 设置为全局变量,该变量在您的getView()onClickListener(). 这意味着,在创建列表的每一行时,您将失去对先前按钮的引用,转而使用新按钮。当单击任何按钮并触发侦听器时,您的逻辑只会发生在使用 创建的最后一行getView(),而不一定是被单击的行。

View要解决此问题,您可以使用方法的参数本地化您对 likeBtn 的引用范围onClick()。此参数将始终是View被点击的,在这种情况下,您的ToggleButton. 在您的getView()中,而不是使用全局 likeBtn,更改此行:

likeBtn = (ToggleButton) view.findViewById(R.id.likesBtn);

到一个创建局部变量的:

ToggleButton likeBtn = (ToggleButton) view.findViewById(R.id.likesBtn);

然后,在您的 中onClick(),创建另一个局部变量来类型转换参数:

@Override
public void onClick(View view)
{
    ToggleButton likeBtn = (ToggleButton) view;

    //Then the rest of your code
}
于 2013-05-29T19:06:36.327 回答