带切换按钮的Android ListView

带切换按钮的Android ListView,android,listview,android-togglebutton,Android,Listview,Android Togglebutton,当我的ListView有更多的iTen可以出现在屏幕上时,我遇到了一个问题;换句话说,当它滚动时。问题是,当我单击其中一个切换按钮时,它会更改ImageView的可见性。但是,当我单击它时,它改变的可见性超过了相应的单击 我正在使用一个适配器来显示ITEN列表 我在下面添加了代码: public class CriteriosAdapter extends ArrayAdapter<Criterio> { private Context context; public Crite

当我的ListView有更多的iTen可以出现在屏幕上时,我遇到了一个问题;换句话说,当它滚动时。问题是,当我单击其中一个切换按钮时,它会更改ImageView的可见性。但是,当我单击它时,它改变的可见性超过了相应的单击

我正在使用一个适配器来显示ITEN列表

我在下面添加了代码:

public class CriteriosAdapter extends ArrayAdapter<Criterio> {

private Context context;

public CriteriosAdapter(Context context, List<Criterio> objects) {
    super(context, 0, objects);
    this.context = context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final Criterio criterio = getItem(position);
    final CriterioViewHolder viewHolder;

    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.fragment_row, parent, false);

        viewHolder = new CriterioViewHolder();
        viewHolder.txtCriterio = (TextView)convertView.findViewById(R.id.txtCriterio);
        viewHolder.tgIrregular = (ToggleButton)convertView.findViewById(R.id.tgIrregular);
        viewHolder.btnCam = (ImageView) convertView.findViewById(R.id.btnCam);

        convertView.setTag(viewHolder);
    }
    else {
        viewHolder = (CriterioViewHolder)convertView.getTag();
    }

    viewHolder.txtCriterio.setText(criterio.nome);
    viewHolder.txtCriterio.setTextColor(context.getColor(R.color.white));
    viewHolder.tgIrregular.setChecked(false);

    viewHolder.tgIrregular.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (viewHolder.tgIrregular.isChecked()) {
                viewHolder.btnCam.setVisibility(View.VISIBLE);
            } else {
                viewHolder.btnCam.setVisibility(View.INVISIBLE);
            }
        }
    });

    viewHolder.btnCam.setOnClickListener(new View.OnClickListener() {
        public void onClick(View arg0) {
            FragmentActivity activity = (FragmentActivity)(context);
            android.support.v4.app.FragmentManager fm = activity.getSupportFragmentManager();
            FotosFragment alertDialog = new FotosFragment();
            alertDialog.show(fm, "fragment_alert");
        }
    });

    return convertView;
}

class CriterioViewHolder {

    TextView txtCriterio;
    ToggleButton tgIrregular;

    ImageView btnCam;

}

}
公共类标准适配器扩展了ArrayAdapter{
私人语境;
公共标准适配器(上下文、列表对象){
超级(上下文,0,对象);
this.context=上下文;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
最终标准=获取项目(位置);
最终标准持票人持票人;
if(convertView==null){
convertView=LayoutInflater.from(getContext()).flate(R.layout.fragment_行,父级,false);
viewHolder=新标准viewHolder();
viewHolder.txtCriterio=(TextView)convertView.findViewById(R.id.txtCriterio);
viewHolder.tgunregular=(ToggleButton)convertView.findViewById(R.id.tgunregular);
viewHolder.btnCam=(ImageView)convertView.findViewById(R.id.btnCam);
convertView.setTag(viewHolder);
}
否则{
viewHolder=(CriterioViewHolder)convertView.getTag();
}
viewHolder.txtrierio.setText(criterio.nome);
viewHolder.txtCriterio.setTextColor(context.getColor(R.color.white));
viewHolder.tgunregular.setChecked(false);
viewHolder.tgunregular.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(viewHolder.tg.isChecked()){
viewHolder.btnCam.setVisibility(View.VISIBLE);
}否则{
viewHolder.btnCam.setVisibility(View.INVISIBLE);
}
}
});
viewHolder.btnCam.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图arg0){
FragmentActivity=(FragmentActivity)(上下文);
android.support.v4.app.FragmentManager fm=activity.getSupportFragmentManager();
FotosFragment alertDialog=新的FotosFragment();
显示(fm,“碎片警报”);
}
});
返回视图;
}
类标准视图持有者{
TextView-txtCriterio;
不规则切换按钮;
ImageView btnCam;
}
}
有人能帮我吗

多谢各位

编辑

我添加了你描述的所有内容。然而,我在5个片段中使用该适配器,如果我转到另一个,然后返回或滚动列表,它仍然会丢失值

我使用criterio.getHash,因为它对所有人都是唯一的。和位置,可以在其他片段中重复,使其变得怪异

public class CriteriosAdapter extends ArrayAdapter<Criterio> {

private Context context;
public static Map<String, Criterio> irregularidades = new HashMap<String, Criterio>();
HashMap<String, Boolean> toggleButtonStateTracker = new HashMap<>();

public CriteriosAdapter(Context context, List<Criterio> objects) {
    super(context, 0, objects);
    this.context = context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final Criterio criterio = getItem(position);
    final CriterioViewHolder viewHolder;

    if (!toggleButtonStateTracker.containsKey(criterio.getHash())){
        toggleButtonStateTracker.put(criterio.getHash(),false);
    }

    Log.e("Toggle Track:", toggleButtonStateTracker.toString());

    if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.fragment_row, parent, false);

        viewHolder = new CriterioViewHolder();
        viewHolder.txtCriterio = (TextView)convertView.findViewById(R.id.txtCriterio);
        viewHolder.tgIrregular = (ToggleButton)convertView.findViewById(R.id.tgIrregular);
        viewHolder.btnCam = (ImageView) convertView.findViewById(R.id.btnCam);

        convertView.setTag(viewHolder);
    }
    else {
        viewHolder = (CriterioViewHolder)convertView.getTag();
    }

    viewHolder.txtCriterio.setText(criterio.nome);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        viewHolder.txtCriterio.setTextColor(context.getColor(R.color.white));
    } else {
        viewHolder.txtCriterio.setTextColor(context.getResources().getColor(R.color.white));
    }

    viewHolder.tgIrregular.setId(criterio.id);

    final boolean isChecked = toggleButtonStateTracker.get(criterio.getHash());
    viewHolder.tgIrregular.setChecked(isChecked);

    viewHolder.btnCam.setTag(criterio.hash);

    if (isChecked) {
        viewHolder.btnCam.setVisibility(View.VISIBLE);
    } else {
        viewHolder.btnCam.setVisibility(View.INVISIBLE);
    }

    viewHolder.tgIrregular.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            toggleButtonStateTracker.put(criterio.getHash(), isChecked);
            if (isChecked) {
                viewHolder.btnCam.setVisibility(View.VISIBLE);
                irregularidades.put(criterio.getHash(), criterio);
            } else {
                viewHolder.btnCam.setVisibility(View.INVISIBLE);
                irregularidades.remove(criterio.getHash());
            }
        }
    });

    viewHolder.btnCam.setOnClickListener(new View.OnClickListener() {
        public void onClick(View arg0) {
            FragmentActivity activity = (FragmentActivity) (context);
            android.support.v4.app.FragmentManager fm = activity.getSupportFragmentManager();
            FotosFragment alertDialog = new FotosFragment();

            Bundle args = new Bundle();
            args.putString("criterioTag", criterio.getHash());
            alertDialog.setArguments(args);

            alertDialog.setCancelable(false);
            alertDialog.show(fm, "fragment_alert");
        }
    });

    return convertView;
}

class CriterioViewHolder {

    TextView txtCriterio;
    ToggleButton tgIrregular;
    ImageView btnCam;

}

}
公共类标准适配器扩展了ArrayAdapter{
私人语境;
public static Map unregularidades=new HashMap();
HashMap toggleButtonStateTracker=新HashMap();
公共标准适配器(上下文、列表对象){
超级(上下文,0,对象);
this.context=上下文;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
最终标准=获取项目(位置);
最终标准持票人持票人;
如果(!toggleButtonStateTracker.containsKey(criterio.getHash())){
toggleButtonStateTracker.put(criterio.getHash(),false);
}
e(“Toggle Track:,toggleButtonStateTracker.toString());
if(convertView==null){
convertView=LayoutInflater.from(getContext()).flate(R.layout.fragment_行,父级,false);
viewHolder=新标准viewHolder();
viewHolder.txtCriterio=(TextView)convertView.findViewById(R.id.txtCriterio);
viewHolder.tgunregular=(ToggleButton)convertView.findViewById(R.id.tgunregular);
viewHolder.btnCam=(ImageView)convertView.findViewById(R.id.btnCam);
convertView.setTag(viewHolder);
}
否则{
viewHolder=(CriterioViewHolder)convertView.getTag();
}
viewHolder.txtrierio.setText(criterio.nome);
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.M){
viewHolder.txtCriterio.setTextColor(context.getColor(R.color.white));
}否则{
viewHolder.txtCriterio.setTextColor(context.getResources().getColor(R.color.white));
}
viewHolder.tg.setId(criterio.id);
最后一个布尔值isChecked=toggleButtonStateTracker.get(criterio.getHash());
viewHolder.TG.setChecked(已检查);
viewHolder.btnCam.setTag(criterio.hash);
如果(已检查){
viewHolder.btnCam.setVisibility(View.VISIBLE);
}否则{
viewHolder.btnCam.setVisibility(View.INVISIBLE);
}
viewHolder.tgunregular.setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener()){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
toggleButtonStateTracker.put(criterio.getHash(),已检查);
如果(已检查){
viewHolder.btnCam.setVisibility(View.VISIBLE);
put(criterio.getHash(),criterio);
}否则{
viewHolder.btnCam.setVisibility(View.INVISIBLE);
remove(criterio.getHash());
}
}
});
viewHolder.btnCam.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图arg0){
FragmentActivity=(FragmentActivity)(上下文);
android.support.v4.app.FragmentManager fm=activity.getSupportFragmentManager();
FotosFragment alertDialog=新的FotosFragment();
Bundle args=新Bundle();
args.putString(“criterioTag”,criterio.getHash());
alertDialog.setArguments(参数);
alertDialog.setCancelable(假);
显示(fm,“碎片警报”);
}
});
返回转换器
if (! toggleButtonStateTracker.containsKey(position)){
  // Now the HashMap definitely contains the key
  toggleButtonStateTracker.put(position,false);
}

boolean isChecked = toggleButtonStateTracker.get(position);
viewHolder.tgIrregular.setChecked(isChecked);
if (isChecked){
  // if your toggle Button is checked, the btnCam should be invisible 
  viewHolder.btnCam.setVisibility(View.INVISIBLE);
} else {
  viewHolder.btnCam.setVisibility(View.VISIBLE);
}
viewHolder.tgIrregular.setOnCheckedChangedListener(new CompoundButton.OnCheckedChangeListener() {
  @Override
  public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    toggleButtonStateTracker.put(getAdapterPosition, isChecked);
  }
});