Android 切换按钮列表视图中出错
我有一个Android 切换按钮列表视图中出错,android,listview,toggle,android-arrayadapter,togglebutton,Android,Listview,Toggle,Android Arrayadapter,Togglebutton,我有一个列表视图,在列表视图中有一个切换按钮。每当我单击第一行toggleButton时,第九行toggleButton也将被单击。当我向下滚动然后再次向上滚动时,第一个toggleButton会松开,但第二个和第十个toggleButton会被单击。真奇怪 public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertV
列表视图
,在列表视图
中有一个切换按钮
。每当我单击第一行toggleButton时,第九行toggleButton也将被单击。当我向下滚动然后再次向上滚动时,第一个toggleButton会松开,但第二个和第十个toggleButton会被单击。真奇怪
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_to_do, null);
holder= new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.task_title);
holder.time = (TextView) convertView.findViewById(R.id.time);
holder.date = (TextView) convertView.findViewById(R.id.date);
final ToggleButton toggle =(ToggleButton)convertView.findViewById(R.id.donePic);
toggle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (toggle.isChecked()) {
Toast.makeText(v.getContext(), "Clicked Laugh Vote", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(v.getContext(), "Not Clicked Laugh Vote", Toast.LENGTH_SHORT).show();
}
}
});
convertView.setTag(holder);
}
holder = (ViewHolder) convertView.getTag();
holder.text.setText(search.get(position).getTitle());
holder.time.setText(search.get(position).getTime());
holder.date.setText(search.get(position).getDate());
return convertView;
}
有人知道错误是从哪里来的吗 这是因为ListView回收视图。您需要始终设置ToggleButton状态,以及不应选中ToggleButton时的状态
toggle.setChecked(isShouldBeChecked);
您可以创建一个布尔数组,其中包含每个切换按钮的状态。如果用户选中某个按钮,则更新其在阵列中的状态。1:您的切换按钮必须位于保持架中
holder.toggle = (ToggleButton) convertView.findViewById(R.id.toggle);
2:在onClick
中,当您检查它是否被单击时,您还必须将其保存在搜索
列表中
holder.toggle.setChecked(search.get(position).isChecked())
isChecked()
方法指示是否选中了切换按钮。为此,必须在列表项中定义一个字段,并为每个项保存“切换”按钮的状态
更新1:
假设您有一个名为MyObject
的类,并且在适配器中有它们的列表。您这样定义了自己的列表:List search=new ArrayList()代码>和您的MyObject
类如下所示:
public class MyObject {
private String title;
private String time;
private String date;
private boolean checked;
public String getTitle(){
return title;
}
public String getDate(){
return date;
}
public String getTime(){
return time;
}
public boolean isChecked(){
return checked;
}
public void setChecked(boolean val){
this.checked = val;
}
}
现在,每次单击并更改切换时,必须在该项目位置上调用setChecked
(而不是显示toast),然后当您要重新创建项目时,必须调用holder.toggle.setChecked(search.get(position).isChecked())
我希望它对您有所帮助我假设ListView没有得到按钮按下的位置,我猜是保存按钮在ListView中按下的位置
@Override
public void onClick(View v) {
//save the tag of the pressed button as position
position = (int)v.getTag();
if (toggle.isChecked()) {
Toast.makeText(v.getContext(), "Clicked Laugh Vote", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(v.getContext(), "Not Clicked Laugh Vote", Toast.LENGTH_SHORT).show();
}
}
});
并将其传递给持有者
holder = (ViewHolder) convertView.getTag();
holder.text.setText(search.get(position).getTitle());
holder.time.setText(search.get(position).getTime());
holder.date.setText(search.get(position).getDate());
return convertView;
如果您像这样定义了搜索
列表:列表
我不明白,您必须在对象中写入此方法:(您可以在此处查看我的答案:。它应该会有帮助!