当我选中一个切换按钮时,第五个切换按钮将在android的listview中自动选中

当我选中一个切换按钮时,第五个切换按钮将在android的listview中自动选中,android,listview,state,togglebutton,Android,Listview,State,Togglebutton,我有带切换按钮的listview。当我选中第一个切换按钮时,第五个切换按钮会自动被选中。当我选中第二个切换按钮时,第七个切换按钮被选中。当我取消选中第五个切换按钮时,它是空值 下面是我的代码 public class CustomUsersAdapter extends ArrayAdapter<User> { public CustomUsersAdapter(Context context, ArrayList<User> users) {

我有带切换按钮的listview。当我选中第一个切换按钮时,第五个切换按钮会自动被选中。当我选中第二个切换按钮时,第七个切换按钮被选中。当我取消选中第五个切换按钮时,它是空值

下面是我的代码

public class CustomUsersAdapter extends ArrayAdapter<User> 
{

public CustomUsersAdapter(Context context, ArrayList<User> users)
    {

            super(context, 0, users);

    }

@Override
public View getView(int position, View convertView, ViewGroup parent) 
{
    //Get an instance of our cell holder                                                                         
     Holder holder;
     holder = new Holder();

    // Get the data item for this position
      User user = getItem(position);    

    // Check if an existing view is being reused, otherwise inflate the view
    if (convertView == null) 
    {
       convertView = LayoutInflater.from(getContext()).inflate(R.layout.activity_main, parent, false);

        // Lookup view for data population
        holder.tvName = (TextView) convertView.findViewById(R.id.tvName);
        holder.tvHome = (TextView) convertView.findViewById(R.id.tvHometown);
        holder.tgbtn = (ToggleButton) convertView.findViewById(R.id.toggleButton1);


        convertView.setTag(holder); //Add this
    }
    else
    {

       holder= (Holder) convertView.getTag();
    }

    holder.tvName.setText(user.name);
    holder.tvHome.setText(user.hometown);

    /** The clicked Item in the ListView */
    RelativeLayout rLayout = (RelativeLayout) convertView;

    /** Getting the toggle button corresponding to the clicked item */

    final ToggleButton tbt  = (ToggleButton) rLayout.getChildAt(2);

    tbt.setOnClickListener(new OnClickListener() {
        String homet;
        @Override
        public void onClick(View v) {

            // TODO Auto-generated method stub
             if (tbt.isChecked()) {
                 //tbt.setChecked(true);
                 ViewGroup parent = (ViewGroup) v.getParent();
                 TextView tvName = (TextView) parent.findViewById(R.id.tvName);
                 homet=tvName.getText().toString();

                    Toast.makeText(getContext(),homet+"Blocked", Toast.LENGTH_SHORT).show();
                } else {
                    tbt.setChecked(false);
                    Toast.makeText(getContext(),homet+ "Unblocked", Toast.LENGTH_SHORT).show();
                }
        }
        });

    // Return the completed view to render on screen
      return convertView;

        }
            //this holder class will be filled from the layout xml and attached to the row as a tag object


    private class Holder
    {
        TextView tvName;
        TextView tvHome;
        ToggleButton tgbtn,tg1;
    }
}
公共类CustomUsersAdapter扩展了ArrayAdapter
{
公共CustomUsersAdapter(上下文,ArrayList用户)
{
超级(上下文,0,用户);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图)
{
//获取我们手机持有者的一个实例
持有人;
保持架=新保持架();
//获取此职位的数据项
用户=获取项目(位置);
//检查是否正在重用现有视图,否则会膨胀视图
if(convertView==null)
{
convertView=LayoutInflater.from(getContext()).flate(R.layout.activity_main,parent,false);
//数据填充的查找视图
holder.tvName=(TextView)convertView.findViewById(R.id.tvName);
holder.tvHome=(TextView)convertView.findViewById(R.id.tvHome);
holder.tgbtn=(ToggleButton)convertView.findViewById(R.id.toggleButton1);
convertView.setTag(holder);//添加此
}
其他的
{
holder=(holder)convertView.getTag();
}
holder.tvName.setText(user.name);
holder.tvHome.setText(用户.家乡);
/**ListView中单击的项目*/
RelativeLayout rLayout=(RelativeLayout)convertView;
/**获取与单击的项目对应的切换按钮*/
最终ToggleButton tbt=(ToggleButton)rLayout.getChildAt(2);
tbt.setOnClickListener(新的OnClickListener(){
弦荷马;
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
如果(tbt.isChecked()){
//tbt.setChecked(正确);
ViewGroup parent=(ViewGroup)v.getParent();
TextView tvName=(TextView)parent.findViewById(R.id.tvName);
homet=tvName.getText().toString();
Toast.makeText(getContext(),homet+“Blocked”,Toast.LENGTH_SHORT.show();
}否则{
tbt.setChecked(假);
Toast.makeText(getContext(),homet+“Unblocked”,Toast.LENGTH_SHORT.show();
}
}
});
//返回要在屏幕上渲染的已完成视图
返回视图;
}
//这个holder类将从布局xml中填充,并作为标记对象附加到行中
私人阶级持有者
{
文本视图tvName;
TextView-tvHome;
切换按钮tgbtn,tg1;
}
}
请帮帮我


以及如何保存所有切换按钮状态,以便我可以使用保存的状态在应用程序重新打开时保留切换按钮的状态。

您的问题是由于
ListView
回收机制而发生的<代码>列表视图回收其子行。为了更好地理解,请查看。

关于解决你的问题,很多人已经提出了这个问题。我能找到的最好的博客是。您可能还需要检查并确认

谢谢你的回复。我了解回收机制,但没有找到任何解决方案来避免这种情况,如果我有一个togglebutton,并且如果我在位置0处检查它(假设item1也有一个togglebutton,我选中了它),那么当我向下滚动时,我会看到item 8 togglebutton已经检查过了