Android ListView中的ToggleButton异常行为
我正在开发一个带有照片的列表视图,在这张照片下面我有一个普通按钮和一个切换按钮。 我希望这个切换按钮像一个like按钮一样工作——如果我点击一个按钮,我会增加照片当前的like数量,如果我再次点击按钮,我会减少like数量 以下是此操作的代码:Android ListView中的ToggleButton异常行为,android,android-listview,togglebutton,Android,Android Listview,Togglebutton,我正在开发一个带有照片的列表视图,在这张照片下面我有一个普通按钮和一个切换按钮。 我希望这个切换按钮像一个like按钮一样工作——如果我点击一个按钮,我会增加照片当前的like数量,如果我再次点击按钮,我会减少like数量 以下是此操作的代码: private View.OnClickListener likeBtnClickListener = new View.OnClickListener() { @Override public void onCl
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张照片,在每张照片下面我有一个切换按钮和一个普通按钮。当我点击第二个按钮下方的切换按钮时(第一张照片下方的切换按钮激活),如果我点击下面的切换按钮或有时不点击,该切换按钮中的任何一个都会工作
你能告诉我我做错了什么吗
谢谢 看起来您已经将likeBtn设置为一个全局变量,它在
getView()
和onClickListener()中都被操作。这意味着在创建列表的每一行时,您将失去对以前按钮的引用,而选择新按钮。当单击任何按钮并调用侦听器时,您的逻辑只会出现在使用getView()
创建的最后一行,而不一定是单击的行
要解决此问题,可以使用View
参数对onClick()
方法对likeBtn的引用范围进行本地化。此参数将始终是单击的视图
,在本例中是您的切换按钮
。在您的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
}