简体   繁体   English

Android Checkbox在自定义ListView中的位置

[英]Android Checkbox position in Custom ListView

After hours of searching I'm unable to quite figure this out. 经过数小时的搜索,我无法完全弄清楚这一点。

I'm trying to save the checkbox state using shared preferences. 我正在尝试使用共享的首选项保存复选框状态。 As far as I know it's saving the state. 据我所知,它正在保存状态。 However, the position is all off and I'm not sure what I'm doing wrong here. 但是,职位全都没有了,我不确定我在做什么错。 The btnToggle state works fine but the checkBox state which I'm not storing in the database is not and I don't want to have to use the database to store the state of that checkBox. btnToggle状态可以正常工作,但是我没有存储在数据库中的checkBox状态却不能,并且我不想使用数据库来存储该checkBox的状态。 Any help would be greatly appreciated! 任何帮助将不胜感激!

public class AlarmListAdapter extends BaseAdapter {

private Context mContext;
private List<AlarmModel> mAlarms;
Alarms displayAlarm = new Alarms();
ViewHolder viewHolder;
private CheckBox checkBox ;

public AlarmListAdapter(Context context, List<AlarmModel> alarms) {
    mContext = context;
    mAlarms = alarms;

}

public void setAlarms(List<AlarmModel> alarms) {
    mAlarms = alarms;
}

@Override
public int getCount() {
    if (mAlarms != null) {
        return mAlarms.size();
    }
    return 0;
}

@Override
public Object getItem(int position) {
    if (mAlarms != null) {
        return mAlarms.get(position);
    }
    return null;
}

@Override
public long getItemId(int position) {
    if (mAlarms != null) {
        return mAlarms.get(position).id;
    }
    return 0;
}

private class ViewHolder
{

    RelativeLayout share;
    RelativeLayout fav;
    RelativeLayout info;
    CheckBox checkBox;

    Switch btnToggle;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {


    final AlarmModel model = (AlarmModel) getItem(position);


    if(convertView == null) {
        LayoutInflater mLayoutInflater = LayoutInflater.from(mContext);
        convertView = mLayoutInflater.inflate(R.layout.alarm_list_item, null);

        viewHolder = new ViewHolder();
        viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.visible_toggle);

        viewHolder.btnToggle = (Switch) convertView.findViewById(R.id.alarm_item_toggle);
        convertView.setTag(viewHolder);


    }
    else{

        viewHolder = (ViewHolder) convertView.getTag();
        viewHolder.checkBox.getTag(position);
        viewHolder.btnToggle.getTag(position);


    }




    viewHolder.checkBox.setTag(Long.valueOf(model.id)); // This line is important.

    viewHolder.btnToggle.setTag(Long.valueOf(model.id));

    TextView txtTime = (TextView) convertView.findViewById(R.id.alarm_item_time);
    txtTime.setText(String.format("%02d:%02d", model.timeHour, model.timeMinute));

    TextView txtName = (TextView) convertView.findViewById(R.id.alarm_item_name);
    txtName.setText(model.name);

    updateTextColor((TextView) convertView.findViewById(R.id.alarm_item_sunday), model.getRepeatingDay(AlarmModel.SUNDAY));
    updateTextColor((TextView) convertView.findViewById(R.id.alarm_item_monday), model.getRepeatingDay(AlarmModel.MONDAY));
    updateTextColor((TextView) convertView.findViewById(R.id.alarm_item_tuesday), model.getRepeatingDay(AlarmModel.TUESDAY));
    updateTextColor((TextView) convertView.findViewById(R.id.alarm_item_wednesday), model.getRepeatingDay(AlarmModel.WEDNESDAY));
    updateTextColor((TextView) convertView.findViewById(R.id.alarm_item_thursday), model.getRepeatingDay(AlarmModel.THURSDAY));
    updateTextColor((TextView) convertView.findViewById(R.id.alarm_item_friday), model.getRepeatingDay(AlarmModel.FRDIAY));
    updateTextColor((TextView) convertView.findViewById(R.id.alarm_item_saturday), model.getRepeatingDay(AlarmModel.SATURDAY));




    viewHolder.btnToggle.setChecked(model.isEnabled);
    viewHolder.btnToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            ((AlarmSettings) mContext).setAlarmEnabled(((Long) buttonView.getTag()).longValue(), isChecked);
        }
    });



    viewHolder.checkBox.setChecked(getFromSP("visbox"));
    viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isVisible){

            viewHolder.checkBox.getTag(position);


            try {
                saveInSp("visbox", isVisible);
            } catch (Exception e) {
                e.printStackTrace();
            }

            if(isVisible) {

             // Do stuff here



            }
            else {





            }

        }


    });




    convertView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            ((AlarmSettings) mContext).startAlarmDetailsActivity(((Long) view.getTag()).longValue());
        }
    });

    convertView.setOnLongClickListener(new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View view) {
            ((AlarmSettings) mContext).deleteAlarm((Long) view.getTag());
            return true;
        }
    });




    return convertView;
}





private void updateTextColor(TextView view, boolean isOn) {
    if (isOn) {
        view.setTextColor(mContext.getResources().getColor(R.color.primary_dark));
    } else {
        view.setTextColor(Color.BLACK);
    }
}



private boolean getFromSP(String key){
    SharedPreferences preferences = mContext.getSharedPreferences("epimelis.com.lyre", android.content.Context.MODE_PRIVATE);
    boolean val = preferences.getBoolean(key, false);
    System.out.println("getting key: "+ key + " with value: " + val);
    return val;
}
private void saveInSp(String key,boolean value) throws Exception {
    //if(!value) throw new Exception("Die Die Die");ooo
    System.out.println("Saving key: " + key + " with value: " + value);
    SharedPreferences preferences = mContext.getSharedPreferences("epimelis.com.lyre", android.content.Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putBoolean(key, value);
    editor.commit();
}

} }

Try this way,hope this will help you to solve your problem. 尝试这种方式,希望这将帮助您解决问题。

Try to add one more flag "isChecked" in your AlarmModel class with default value false and use below code. 尝试在AlarmModel类中添加一个默认值为false的标志“ isChecked”,并使用以下代码。

public class AlarmListAdapter extends BaseAdapter {

    private Context mContext;
    private List<AlarmModel> mAlarms;
    Alarms displayAlarm = new Alarms();

    public AlarmListAdapter(Context context, List<AlarmModel> alarms) {
        mContext = context;
        mAlarms = alarms;
    }

    public void setAlarms(List<AlarmModel> alarms) {
        mAlarms = alarms;
    }

    @Override
    public int getCount() {
        return mAlarms.size();
    }

    @Override
    public Object getItem(int position) {
        return mAlarms.get(position);
    }

    @Override
    public long getItemId(int position) {
        return mAlarms.get(position).id;
    }

    static class ViewHolder
    {
        CheckBox checkBox;
        Switch btnToggle;
        TextView txtTime;
        TextView txtName;
        TextView txtSunday;
        TextView txtMonday;
        TextView txtTuesday;
        TextView txtWednesday;
        TextView txtThursday;
        TextView txtFriday;
        TextView txtSaturday;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if(convertView == null) {
            viewHolder = new ViewHolder();
            convertView = LayoutInflater.from(mContext).inflate(R.layout.alarm_list_item, null);
            viewHolder.btnToggle = (Switch) convertView.findViewById(R.id.alarm_item_toggle);
            viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.visible_toggle);
            viewHolder.txtTime = (CheckBox) convertView.findViewById(R.id.alarm_item_time);
            viewHolder.txtName = (CheckBox) convertView.findViewById(R.id.alarm_item_name);
            viewHolder.txtSunday = (CheckBox) convertView.findViewById(R.id.alarm_item_sunday);
            viewHolder.txtMonday = (CheckBox) convertView.findViewById(R.id.alarm_item_monday);
            viewHolder.txtTuesday = (CheckBox) convertView.findViewById(R.id.alarm_item_tuesday);
            viewHolder.txtWednesday = (CheckBox) convertView.findViewById(R.id.alarm_item_wednesday);
            viewHolder.txtThursday = (CheckBox) convertView.findViewById(R.id.alarm_item_thursday);
            viewHolder.txtFriday = (CheckBox) convertView.findViewById(R.id.alarm_item_friday);
            viewHolder.txtSaturday = (CheckBox) convertView.findViewById(R.id.alarm_item_saturday);
            convertView.setTag(viewHolder);
        }
        else{

            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.txtTime.setText(String.format("%02d:%02d", mAlarms.get(position).timeHour, mAlarms.get(position).timeMinute));
        viewHolder.txtName.setText(mAlarms.get(position).name);

        updateTextColor(viewHolder.txtMonday, mAlarms.get(position).getRepeatingDay(AlarmModel.SUNDAY));
        updateTextColor(viewHolder.txtMonday, mAlarms.get(position).getRepeatingDay(AlarmModel.MONDAY));
        updateTextColor(viewHolder.txtMonday, mAlarms.get(position).getRepeatingDay(AlarmModel.TUESDAY));
        updateTextColor(viewHolder.txtMonday, mAlarms.get(position).getRepeatingDay(AlarmModel.WEDNESDAY));
        updateTextColor(viewHolder.txtMonday, mAlarms.get(position).getRepeatingDay(AlarmModel.THURSDAY));
        updateTextColor(viewHolder.txtMonday, mAlarms.get(position).getRepeatingDay(AlarmModel.FRDIAY));
        updateTextColor(viewHolder.txtMonday, mAlarms.get(position).getRepeatingDay(AlarmModel.SATURDAY));

        viewHolder.btnToggle.setChecked(mAlarms.get(position).isEnabled);
        viewHolder.btnToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                ((AlarmSettings) mContext).setAlarmEnabled((position), isChecked);
                mAlarms.get(position).isEnabled = isChecked;
            }
        });

        viewHolder.checkBox.setChecked(mAlarms.get(position).isChecked);
        viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isVisible){
                mAlarms.get(position).isChecked = isVisible;
                if(isVisible) {
                    // Do visible stuff here
                }
                else {
                    // Do invisible or gone stuff here

                }

            }


        });

        convertView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                ((AlarmSettings) mContext).startAlarmDetailsActivity(position);
            }
        });

        convertView.setOnLongClickListener(new View.OnLongClickListener() {

            @Override
            public boolean onLongClick(View view) {
                ((AlarmSettings) mContext).deleteAlarm(position);
                return true;
            }
        });

        return convertView;
    }

    private void updateTextColor(TextView view, boolean isOn) {
        if (isOn) {
            view.setTextColor(mContext.getResources().getColor(R.color.primary_dark));
        } else {
            view.setTextColor(Color.BLACK);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM