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;