Продолжая ответ MikeT, вы узнаете, как вы можете сделать ListView и изменить базовые данные при установке флажка.
Вам необходимо добавить ListView в основной макет, например: -
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<ListView
android:id="@+id/cblist"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
- Файл представляет собой activity_Main.xml
Макет для каждого элемента списка, например: -
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/entrydate"
android:layout_width="100dp"
android:layout_height="match_parent" />
<CheckBox
android:id="@+id/cb01"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
<CheckBox
android:id="@+id/cb02"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
<CheckBox
android:id="@+id/cb03"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
<CheckBox
android:id="@+id/cb04"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
<CheckBox
android:id="@+id/cb05"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
<CheckBox
android:id="@+id/cb06"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
<CheckBox
android:id="@+id/cb07"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
<CheckBox
android:id="@+id/cb08"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
<CheckBox
android:id="@+id/cb09"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
<CheckBox
android:id="@+id/cb10"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent" />
</LinearLayout>
Для того, чтобы слушатель мог определить дату и флажок для нового класса, например
public class CBTag {
private String mEntrydate;
private int mCheckBoxNumber;
public CBTag(String entrydate, int checkboxnumber) {
this.mEntrydate = entrydate;
this.mCheckBoxNumber = checkboxnumber;
}
public int getCheckBoxNumber() {
return mCheckBoxNumber;
}
public void setCheckBoxNumber(int mCheckBoxNumber) {
this.mCheckBoxNumber = mCheckBoxNumber;
}
public String getEntrydate() {
return mEntrydate;
}
public void setEntrydate(String mEntrydate) {
this.mEntrydate = mEntrydate;
}
}
Потребуется настраиваемый адаптер, который будет использовать вышеуказанный макет для каждого элемента в списке, а также объекты CBTag для установки тега для флажков
public class CBListAdapter extends CursorAdapter {
private Context mContext;
private DBHelper mDB;
public CBListAdapter(Context context, Cursor cursor) {
super(context,cursor,0);
mContext = context;
mDB = new DBHelper(mContext);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return super.getView(position,convertView,parent);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {
return LayoutInflater.from(mContext).inflate(R.layout.cblist_item,viewGroup,false);
}
@Override
public void bindView(View view, Context context, Cursor csr) {
TextView entrydate = view.findViewById(R.id.entrydate);
String entry_date = csr.getString(csr.getColumnIndex(DBHelper.DAYENTRIES_COL_DATE));
entrydate.setText(entry_date);
CheckBox[] cblist = new CheckBox[]{
view.findViewById(R.id.cb01),
view.findViewById(R.id.cb02),
view.findViewById(R.id.cb03),
view.findViewById(R.id.cb04),
view.findViewById(R.id.cb05),
view.findViewById(R.id.cb06),
view.findViewById(R.id.cb07),
view.findViewById(R.id.cb08),
view.findViewById(R.id.cb09),
view.findViewById(R.id.cb10)
};
// For Each CheckBox set the tag as a CBTag object (Holds String for date and int for CheckBox #)
// Also add an onClick Listener that will update the applicable row/column and
// refresh the ListView
int cbidx = 0;
for (CheckBox c: cblist) {
c.setChecked(csr.getInt(cbidx + 1) == 1);
c.setTag(new CBTag(entry_date,cbidx + 1));
c.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
CBTag cbtag = (CBTag) view.getTag();
mDB.setDayEntryForOneCheckBox(
cbtag.getEntrydate(),
cbtag.getCheckBoxNumber(),
((CheckBox)view).isChecked()
);
((MainActivity) mContext).refreshDateEntryList();
}
});
cbidx++;
}
}
}
НесколькоИзменения были внесены в DatabaseHelper, теперь это так
public class DBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mydb";
public static final int DBVERSION = 1;
public static final String TB_DAYENTRIES = "day_entries";
public static final String DAYENTRIES_COL_DATE = "_date";
public static final String DAYENTRIES_COL_CB01 = "_cb01";
public static final String DAYENTRIES_COL_CB02 = "_cb02";
public static final String DAYENTRIES_COL_CB03 = "_cb03";
public static final String DAYENTRIES_COL_CB04 = "_cb04";
public static final String DAYENTRIES_COL_CB05 = "_cb05";
public static final String DAYENTRIES_COL_CB06 = "_cb06";
public static final String DAYENTRIES_COL_CB07 = "_cb07";
public static final String DAYENTRIES_COL_CB08 = "_cb08";
public static final String DAYENTRIES_COL_CB09 = "_cb09";
public static final String DAYENTRIES_COL_CB10 = "_cb10";
SQLiteDatabase mDB;
public DBHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
mDB = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
String crt_tbl_sql = "CREATE TABLE IF NOT EXISTS " + TB_DAYENTRIES + "(" +
DAYENTRIES_COL_DATE + " TEXT PRIMARY KEY NOT NULL," +
DAYENTRIES_COL_CB01 + " INTEGER DEFAULT 0," +
DAYENTRIES_COL_CB02 + " INTEGER DEFAULT 0," +
DAYENTRIES_COL_CB03 + " INTEGER DEFAULT 0," +
DAYENTRIES_COL_CB04 + " INTEGER DEFAULT 0," +
DAYENTRIES_COL_CB05 + " INTEGER DEFAULT 0," +
DAYENTRIES_COL_CB06 + " INTEGER DEFAULT 0," +
DAYENTRIES_COL_CB07 + " INTEGER DEFAULT 0," +
DAYENTRIES_COL_CB08 + " INTEGER DEFAULT 0," +
DAYENTRIES_COL_CB09 + " INTEGER DEFAULT 0," +
DAYENTRIES_COL_CB10 + " INTEGER DEFAULT 0" +
")";
db.execSQL(crt_tbl_sql);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
public long addNewDayEntry(String date) {
ContentValues cv = new ContentValues();
cv.put(DAYENTRIES_COL_DATE,date);
return mDB.insert(TB_DAYENTRIES,null,cv);
}
public Cursor getDateEntryListAsCursor() {
String[] columns = new String[]{"*,rowid AS _id"};
return mDB.query(TB_DAYENTRIES,columns,null,null,null,null,null);
}
public int setDayEntryForOneCheckBox(String date, int checkbox, boolean status) {
int rv = 0;
String whereclause = DAYENTRIES_COL_DATE + "=?";
String[] whereargs = new String[]{date};
ContentValues cv = new ContentValues();
int value = 0;
if (status) {
value = 1;
}
switch (checkbox) {
case 1:
cv.put(DAYENTRIES_COL_CB01,value);
break;
case 2:
cv.put(DAYENTRIES_COL_CB02,value);
break;
case 3:
cv.put(DAYENTRIES_COL_CB03,value);
break;
case 4:
cv.put(DAYENTRIES_COL_CB04,value);
break;
case 5:
cv.put(DAYENTRIES_COL_CB05,value);
break;
case 6:
cv.put(DAYENTRIES_COL_CB06,value);
break;
case 7:
cv.put(DAYENTRIES_COL_CB07,value);
break;
case 8:
cv.put(DAYENTRIES_COL_CB08,value);
break;
case 9:
cv.put(DAYENTRIES_COL_CB09,value);
break;
case 10:
cv.put(DAYENTRIES_COL_CB10,value);
break;
}
if (cv.size() == 1) {
rv = mDB.update(TB_DAYENTRIES,cv,whereclause,whereargs);
}
return rv;
}
public boolean isDayEntryCheckboxSet(String date, int checkbox) {
boolean rv = false;
String whereclause = DAYENTRIES_COL_DATE + "=?";
String[] whereargs = new String[]{date};
if (checkbox < 1 || checkbox > 10) {
return false;
}
Cursor csr = mDB.query(TB_DAYENTRIES,null,whereclause,whereargs,null,null,null);
if (csr.moveToFirst()) {
rv = csr.getInt(csr.getColumnIndex(getCheckboxColumnNameFromNumber(checkbox))) == 1;
}
csr.close();
return rv;
}
private String getCheckboxColumnNameFromNumber(int checkbox) {
switch (checkbox) {
case 1:
return DAYENTRIES_COL_CB01;
case 2:
return DAYENTRIES_COL_CB02;
case 3:
return DAYENTRIES_COL_CB03;
case 4:
return DAYENTRIES_COL_CB04;
case 5:
return DAYENTRIES_COL_CB05;
case 6:
return DAYENTRIES_COL_CB06;
case 7:
return DAYENTRIES_COL_CB07;
case 8:
return DAYENTRIES_COL_CB08;
case 9:
return DAYENTRIES_COL_CB09;
case 10:
return DAYENTRIES_COL_CB10;
}
return "";
}
}
В последний раз основное действие было изменено, теперь это похоже на
public class MainActivity extends AppCompatActivity {
DBHelper mDB;
ListView mLV;
CBListAdapter mCBLA;
Cursor mCsr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDB = new DBHelper(this);
loadInitialData();
mCsr = mDB.getDateEntryListAsCursor();
mLV = this.findViewById(R.id.cblist);
mCBLA = new CBListAdapter(this,mCsr);
mLV.setAdapter(mCBLA);
}
protected void onResume() {
super.onResume();
refreshDateEntryList();
}
public void refreshDateEntryList() {
mCsr = mDB.getDateEntryListAsCursor();
mCBLA.swapCursor(mCsr);
}
private void loadInitialData() {
long rowcount = DatabaseUtils.queryNumEntries(mDB.getWritableDatabase(),DBHelper.TB_DAYENTRIES);
if (rowcount > 0) return;
String[] dates_to_add = new String[]{"2018-09-09","2018-09-10","2018-09-11"};
for (String s: dates_to_add) {
mDB.addNewDayEntry(s);
}
mDB.setDayEntryForOneCheckBox("2018-09-10",3,true);
mDB.setDayEntryForOneCheckBox("2018-09-09",9,true);
}
}
- Это помещает 3 строки вТаблица также устанавливает некоторые строки для проверки.
Похоже, тhis
Установка флажка изменяет флажок, а также данные в базе данных.
![enter image description here](https://i.stack.imgur.com/LrZeB.png)