У меня есть ListView, который заполнен пользовательским CursorAdapter, этот CursorAdapter имеет несколько выбираемых/действующих компонентов внутри.
Когда даже я выполняю некоторые действия в ListView и прокручиваю представление, состояния теряются.
Когда я наблюдал за logcat, я мог видеть, что код onCheckChangeListener для этих компонентов вызывается каждый раз, даже если кнопки не нажимаются. Не уверен, что не так.
public class CalendarSettinsAdapater extends CursorAdapter {
private int myClickPosition;
private int myCheckPosition;
DBHelper dbHelper;
Context classContext;
Cursor classCursor;
ToggleButton mtoggle;
CheckBox mCheckBox;
TextView mTitle;
Button mButton;
boolean buttonEnable = false;
ToggleEvent toggleEvent = new ToggleEvent();
ToggleEventListener toggleEventLis = new ToggleEventListener();
ListView calListView;
@SuppressWarnings("deprecation")
public CalendarSettinsAdapater(Context context, Cursor c) {
super(context, c);
}
@SuppressLint("ResourceAsColor")
@Override
public void bindView(View view, Context context, Cursor cursor) {
Typeface tf = Typeface.createFromAsset(context.getAssets(),
"fonts/Glegoo-Regular.ttf");
calListView = (ListView) view.findViewById(R.id.calendarSettingsList);
mTitle = (TextView) view.findViewById(R.id.calendarName);
mtoggle = (ToggleButton) view.findViewById(R.id.silentToggle);
mButton = (Button) view.findViewById(R.id.calendarExceptionEvents);
mCheckBox = (CheckBox) view.findViewById(R.id.visibility);
mtoggle.setTag(cursor.getPosition());
mButton.setTag(cursor.getPosition());
mCheckBox.setTag(cursor.getPosition());
mTitle.setTypeface(tf);
mTitle.setText(cursor.getString(cursor.getColumnIndex(cursor
.getColumnName(1))));
mTitle.setTextColor(Color.WHITE);
classContext = context;
classCursor = cursor;
View v = view.findViewById(R.id.circleShape);
final GradientDrawable rectCal = (GradientDrawable) v.getBackground();
int key = Integer.parseInt(cursor.getString(cursor
.getColumnIndex(cursor.getColumnName(0))));
rectCal.setColor(cursor.getInt(cursor.getColumnIndex(cursor
.getColumnName(4))));
mCheckBox
.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
int position = (Integer) buttonView.getTag();
myCheckPosition = position;
if (isChecked) {
updateDbToShow(classContext, classCursor);
} else {
updateDbToGreyed(classContext, classCursor);
}
}
});
mtoggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
final int position = (Integer) buttonView.getTag();
myClickPosition = position;
if (isChecked) {
updateDbToHandle(classContext, classCursor);
} else {
updateDbToIgnore(classContext, classCursor);
}
}
});
setProperToggleButtonStatus(classContext, classCursor, mtoggle, mButton);
setProperCheckBoxStatus(classContext, classCursor, mCheckBox, mTitle);
}
private void setProperCheckBoxStatus(Context context, Cursor cursor,
CheckBox mcheckBox, TextView mTitle) {
String calVisible = cursor.getString(cursor.getColumnIndex(cursor
.getColumnName(5)));
if (calVisible.equalsIgnoreCase("1")) {
mcheckBox.setChecked(true);
mtoggle.setEnabled(true);
if (buttonEnable == true) {
mButton.setEnabled(true);
} else
mButton.setEnabled(false);
} else {
mcheckBox.setChecked(false);
mtoggle.setEnabled(true);
mButton.setEnabled(true);
}
}
private void setProperToggleButtonStatus(Context context, Cursor cursor,
ToggleButton mtoggle, Button mButton) {
dbHelper = new DBHelper(context);
String calState1 = cursor.getString(cursor.getColumnIndex(cursor
.getColumnName(2)));
int calState = Integer.parseInt(calState1);
int expEvent = dbHelper.getExceptionEvents(cursor.getString(cursor
.getColumnIndex(cursor.getColumnName(0))), calState);
String buttonLabel = String.valueOf(expEvent);
if (calState1.equalsIgnoreCase("1")) {
mtoggle.setChecked(true);
if (expEvent < 1) {
mButton.setEnabled(false);
buttonEnable = false;
} else {
mButton.setEnabled(true);
buttonEnable = true;
}
mtoggle.setEnabled(true);
mButton.setText(buttonLabel);
mButton.setTextColor(Color.WHITE);
Drawable drawable = context.getResources().getDrawable(
R.drawable.ic_custom_ringer);
drawable.setBounds(0, 0,
(int) (drawable.getIntrinsicWidth() * 0.40),
(int) (drawable.getIntrinsicHeight() * 0.40));
mButton.setCompoundDrawables(drawable, null, null, null);
} else {
mtoggle.setChecked(false);
if (expEvent < 1) {
mButton.setEnabled(false);
buttonEnable = false;
} else {
mButton.setEnabled(true);
buttonEnable = true;
}
mtoggle.setEnabled(true);
mButton.setText(buttonLabel);
mButton.setTextColor(Color.WHITE);
mButton.setCompoundDrawablesWithIntrinsicBounds(
R.drawable.ic_custom_silent, 0, 0, 0);
Drawable drawable = context.getResources().getDrawable(
R.drawable.ic_custom_silent);
drawable.setBounds(0, 0,
(int) (drawable.getIntrinsicWidth() * 0.40),
(int) (drawable.getIntrinsicHeight() * 0.40));
mButton.setCompoundDrawables(drawable, null, null, null);
}
}
private void updateDbToGreyed(Context context, Cursor cursor) {
//update database
}
private void updateDbToShow(Context context, Cursor cursor) {
//update database
}
protected void updateDbToHandle(Context context, Cursor cursor) {
//update database
}
protected void updateDbToIgnore(Context context, Cursor cursor) {
//update database
}
@SuppressWarnings("static-access")
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
classContext = context;
classCursor = cursor;
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.calendar_settings_item, null);
calListView = (ListView) view.findViewById(R.id.calendarSettingsList);
mTitle = (TextView) view.findViewById(R.id.calendarName);
mtoggle = (ToggleButton) view.findViewById(R.id.silentToggle);
mButton = (Button) view.findViewById(R.id.calendarExceptionEvents);
mCheckBox = (CheckBox) view.findViewById(R.id.visibility);
setProperCheckBoxStatus(classContext, classCursor, mCheckBox, mTitle);
setProperToggleButtonStatus(classContext, classCursor, mtoggle, mButton);
return view;
}
private OnClickListener mCheckBoxListener = new OnClickListener() {
@Override
public void onClick(View v) {
final int position = (Integer) v.getTag();
myCheckPosition = position;
if (mCheckBox.isChecked()) {
updateDbToShow(classContext, classCursor);
} else {
updateDbToGreyed(classContext, classCursor);
}
}
};
private OnClickListener mToggleClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
final int position = (Integer) v.getTag();
myClickPosition = position;
if (mtoggle.isChecked()) {
updateDbToHandle(classContext, classCursor);
} else {
updateDbToIgnore(classContext, classCursor);
}
}
};
}][2]