K
The solution is very different from https://ru.stackoverflow.com/a/507146/177345 with the difference that you need to process the activate clips, not the adapter listener.Since we cannot change the values in the courseor, but only read them from there, a local repository is required to memorize the current status of the checkboxes.In the adapter, you need to transmit the data that should be displayed in the view, in your case, it's a courseor with a sample of the OBD. The auxiliary mass of bulb values is not to be transferred, it is created inside the adapter.Example implementation may look like:private void getProductList()
{
// Если требуется только имя, следует и запрашивать из БД только
//колонку с именем, а не все в кучу
// Если требуется только записи с каким то условием, то их и надо запрашивать,
// а не все в подряд, а потом выбирать нужные каким то циклом
// так же эти данные включены и в курсор для адаптера и нет нужды
// получать то же самое дважды
// final Cursor cursor = mSqLiteDatabase.query("products", new String[] {DatabaseProductHelper.PRODUCT_ID, DatabaseProductHelper.PRODUCT_NAME,"list = ?", new String[] {""+ intValue}, null, null, null) ;
//то же самое, только нужные в адаптере колонки
final Cursor cursorc = mSqLiteDatabase.query("products", new String[] {DatabaseProductHelper.PRODUCT_ID,DatabaseProductHelper.PRODUCT_NAME, DatabaseProductHelper.PRODUCT_COUNT, DatabaseProductHelper.PRODUCT_TYPE, DatabaseProductHelper.PRODUCT_COMPLETE}, "list = ?", new String[] {""+ intValue}, null, null, null);
final ArrayList<String> arrTblNames = new ArrayList<String>();
// копирование данных из курсора в массив сильно упрощается,
// так как у нас только нужные данные
while ( cursorc.moveToNext() ) {
arrTblNames.add(cursorc.getString(cursorc.getColumnIndex("name")));
}
String[] from = {DatabaseProductHelper.PRODUCT_NAME, DatabaseProductHelper.PRODUCT_COUNT, DatabaseProductHelper.PRODUCT_TYPE, DatabaseProductHelper.PRODUCT_COMPLETE};
int[] to = {R.id.ColMemberID, R.id.ColName, R.id.count_tv, R.id.chb_products};
adapter = new InteractiveArrayAdapter(ListBuilder.this,
R.layout.row,
cursorc,
from,
to
);
//lv_products.setAdapter(adapter);
}
// у виджетов есть свойство Visiblity, которое управляет видимостью на
// экране, зачем тут использовать прозрачность ?
// я бы поменял всю логику вообще, исходя из условия ниже,
// зачем получаnь и формировать данные, если они могут не понадобится
if(!arrTblNames.isEmpty()){
empty_bd_layout.setAlpha(0);
lv_products.setAdapter(adapter);
}
else{
empty_bd_layout.setAlpha(255);
}
}
Adapter:public class InteractiveArrayAdapter extends SimpleCursorAdapter
{
private int layout;
private boolean checked[];
public InteractiveArrayAdapter(Context _context, int _layout, Cursor _cursor, String[] _from, int[] _to) {
super(_context, _layout, _cursor, _from, _to);
layout = _layout;
// инициализируем вспомогательный массив начальными отметками чекбоксов из курсора
checked = new boolean[_cursor.getCount()];
int i = 0;
while ( _cursor.moveToNext() ) {
int checkMarker = _cursor.getInt(_cursor.getColumnIndex(DatabaseProductHelper.PRODUCT_COMPLETE));
checked[i] = (checkMarker == 1) ? true: false;
i = i + 1;
}
// нужно вернуть указатель курсора в первоначальное положение
// перед первой записью, для корректной работы адаптера
_cursor.moveToPosition(-1);
}
@Override
public void bindView(View view, Context _context, Cursor _cursor) {
String prod_name = _cursor.getString(_cursor.getColumnIndex(DatabaseProductHelper.PRODUCT_NAME));
String prod_count = _cursor.getString(_cursor.getColumnIndex(DatabaseProductHelper.PRODUCT_COUNT));
String prod_type = _cursor.getString(_cursor.getColumnIndex(DatabaseProductHelper.PRODUCT_TYPE));
// эта строка здесь теперь по видимому не нужна, поскольку значения отметок
// из курсора мы уже извлекли
//int prod_complete = _cursor.getInt(_cursor.getColumnIndex(DatabaseProductHelper.PRODUCT_COMPLETE));
TextView name_prod_tv = (TextView)view.findViewById(R.id.ColMemberID);
TextView count_prod_tv = (TextView)view.findViewById(R.id.ColName);
TextView type_prod_tv = (TextView)view.findViewById(R.id.count_tv);
CheckBox chb = (CheckBox)view.findViewById(R.id.chb_products);
chb.setFocusable(false);
chb.setClickable(false);
name_prod_tv.setText(prod_name);
count_prod_tv.setText(prod_count);
type_prod_tv.setText(prod_type);
// устанавливаем чекбоксы по вспомогательному массиву, а не по курсору
// получаем текущую позицию курсора (и соответственно адаптера) через его метод
chb.setChecked(checked[_cursor.getPosition()]);
}
@Override
public View newView(Context _context, Cursor _cursor, ViewGroup _parent)
{
LayoutInflater inflater = (LayoutInflater)_context.getSystemService(_context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(layout, _parent, false);
return view;
}
// метод для фиксации изменений отметок чекбоксов из активити
public void setChecked(int position){
// инвертируем значение при обработке клика этим методом
checked[position] = !checked[position];
}
}
The recording of changes to the OBD on the chequebox marks is, as I recall, in the processing of the click in the list listener, so this action is not included in the adapter, but it has to be present, or it will be lost when it comes out.