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;

如果您像这样定义了
搜索
列表:
列表
我不明白,您必须在对象中写入此方法:(您可以在此处查看我的答案:。它应该会有帮助!