带切换按钮的Android ListView
当我的ListView有更多的iTen可以出现在屏幕上时,我遇到了一个问题;换句话说,当它滚动时。问题是,当我单击其中一个切换按钮时,它会更改ImageView的可见性。但是,当我单击它时,它改变的可见性超过了相应的单击 我正在使用一个适配器来显示ITEN列表 我在下面添加了代码:带切换按钮的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
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);
}
});