ToggleButton ListView 中的错误
Error in ToggleButton ListView
我有一个listView
并且listView
中有一个toggleButton
。每当我单击第一行 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);
您可以创建一个布尔数组,其中包含每个 ToggleButton 的状态。如果用户选中某个按钮,则更新他在数组中的状态。
1:您的切换按钮必须在 holder 中。
holder.toggle = (ToggleButton) convertView.findViewById(R.id.toggle);
2:在onClick
中检查是否被点击时,也必须将其保存在search
列表中。
holder.toggle.setChecked(search.get(position).isChecked())
isChecked()
方法指示是否选中切换按钮。为此,您必须在列表项中定义一个字段,并为每个项目保存切换按钮的状态。
更新 1:
假设您有一个名为 MyObject
的 class,并且您在适配器中有一个列表。你这样定义你的:List<MyObject> search = new ArrayList<MyObject>();
而你的 MyObject
class 是这样的:
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;
我有一个listView
并且listView
中有一个toggleButton
。每当我单击第一行 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);
您可以创建一个布尔数组,其中包含每个 ToggleButton 的状态。如果用户选中某个按钮,则更新他在数组中的状态。
1:您的切换按钮必须在 holder 中。
holder.toggle = (ToggleButton) convertView.findViewById(R.id.toggle);
2:在onClick
中检查是否被点击时,也必须将其保存在search
列表中。
holder.toggle.setChecked(search.get(position).isChecked())
isChecked()
方法指示是否选中切换按钮。为此,您必须在列表项中定义一个字段,并为每个项目保存切换按钮的状态。
更新 1:
假设您有一个名为 MyObject
的 class,并且您在适配器中有一个列表。你这样定义你的:List<MyObject> search = new ArrayList<MyObject>();
而你的 MyObject
class 是这样的:
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;