Я считаю, что это делает то, что вы хотите (вместо того, чтобы обновлять строку, это столбец идентификатора Toast, который затем может быть передан через намерение и извлеченные данные).
Он использует тег каждого TextView для хранения соответствующего id
DatabaseHelper использовал DatabaseHelper.java : -
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DBNAME = "school.db";
public static final int DBVERSION = 1;
public static final String TBL_TERM = "term";
public static final String COL_TERM_ID = BaseColumns._ID;
public static final String COL_TERM_TITLE = "title";
public static final String COL_TERM_STARTDATE = "startdate";
public static final String COL_TERM_ENDDATE = "enddate";
SQLiteDatabase mDB;
public DatabaseHelper(Context context) {
super(context, DBNAME, null, 1);
mDB = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
String crt_term_sql = "CREATE TABLE IF NOT EXISTS " + TBL_TERM + "(" +
COL_TERM_ID + " INTEGER PRIMARY KEY, " +
COL_TERM_TITLE + " TEXT, " +
COL_TERM_STARTDATE + " TEXT," +
COL_TERM_ENDDATE + " TEXT" +
")";
db.execSQL(crt_term_sql);
}
public long addTerm(String title, String startdate, String enddate) {
ContentValues cv = new ContentValues();
cv.put(COL_TERM_TITLE,title);
cv.put(COL_TERM_STARTDATE,startdate);
cv.put(COL_TERM_ENDDATE,enddate);
return mDB.insert(TBL_TERM,null,cv);
}
public Cursor getAllData() {
return mDB.query(TBL_TERM,null,null,null,null,null,COL_TERM_STARTDATE + " ASC");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
Активность: -
public class MainActivity extends AppCompatActivity {
LinearLayout layout;
DatabaseHelper myDB;
Cursor mCsr;
Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
layout = this.findViewById(R.id.LinearLayout);
mContext = this;
myDB = new DatabaseHelper(this);
addSomeData();
mCsr = myDB.getAllData();
while (mCsr.moveToNext()) {
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.HORIZONTAL);
long currentID = mCsr.getLong(mCsr.getColumnIndex(DatabaseHelper.COL_TERM_ID));
addtextView(ll,currentID,mCsr.getString(mCsr.getColumnIndex(DatabaseHelper.COL_TERM_ID)) + " ");
addtextView(ll,currentID,mCsr.getString(mCsr.getColumnIndex(DatabaseHelper.COL_TERM_TITLE))+ " ");
addtextView(ll,currentID,mCsr.getString(mCsr.getColumnIndex(DatabaseHelper.COL_TERM_STARTDATE))+ " ");
addtextView(ll, currentID,mCsr.getString(mCsr.getColumnIndex(DatabaseHelper.COL_TERM_ENDDATE))+ " ");
layout.addView(ll);
}
}
private void addtextView(LinearLayout ll, long tag, String data) {
TextView current_tv = new TextView(this);
current_tv.setTag(String.valueOf(tag)); //<<<<<<<<<< SETS THE TAG with current_id
current_tv.setText(data);
ll.addView(current_tv);
current_tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
long id = Long.valueOf((String)v.getTag()); //<<<<<<<<<< RETRIEVES THE id FROM THE TAG
Toast.makeText(mContext,"You clicked on ID " + String.valueOf(id),Toast.LENGTH_SHORT).show();
}
});
}
// JUST TO ADD SOME DATA FOR TESTING (if none exists)
private void addSomeData() {
if (DatabaseUtils.queryNumEntries(myDB.getWritableDatabase(),DatabaseHelper.TBL_TERM) < 1) {
myDB.addTerm("Term 1","2019-01-01","2019-03-31");
myDB.addTerm("Term 2","2019-04-01","2019-06-30");
myDB.addTerm("Term 3","2019-07-01","2019-08-31");
myDB.addTerm("Term 4","2019-09-01","2019-12-31");
}
}
}
Обратите внимание, что если вы добавляете / удаляете / редактируете строки в иерархически более низкой активности, вам необходимо перестроить представления.
LinearLayout с горизонтальной ориентацией был добавлен для каждой строки. Основной Linearlayout установлен в вертикальной ориентации.
Альтернатива (типовое решение)
Однако более простым в управлении (особенно в отношении обновленных данных) является ListView. Возможно, рассмотрите следующее как альтернативу.
В макете действия (Main2Activity в этом примере) добавьте ListView, например. activity_main2.xml - это: -
<?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=".Main2Activity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Terms"
android:layout_marginBottom="20dp"/>
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
Если вам нужно 3 TextViews (идентификатор не очень удобен для пользователя, так как он ничего не значит и может даже сбить с толку) на отображаемую строку, то другой макет для каждой строки списка, например, termlist.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/title"
android:layout_width="0dp"
android:layout_weight="6"
android:layout_height="match_parent" />
<TextView
android:id="@+id/startdate"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="match_parent" />
<TextView
android:id="@+id/enddate"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="match_parent" />
</LinearLayout>
DatabaseHelper DatabaseJelper.java не изменяется.
MainActivity2.java (используется как альтернатива MainActivity, чтобы можно было проверить оба действия): -
public class Main2Activity extends AppCompatActivity {
DatabaseHelper myDB;
ListView mylistview;
SimpleCursorAdapter sca;
Cursor mCsr;
Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
mContext = this;
mylistview = this.findViewById(R.id.listview);
myDB = new DatabaseHelper(this);
addSomeData();
manageListView();
}
private void manageListView() {
mCsr = myDB.getAllData();
if (sca == null) {
sca = new SimpleCursorAdapter(
this,
R.layout.termlist,mCsr,
new String[]{DatabaseHelper.COL_TERM_TITLE,DatabaseHelper.COL_TERM_STARTDATE,DatabaseHelper.COL_TERM_ENDDATE},
new int[]{R.id.title,R.id.startdate,R.id.enddate},
0
);
mylistview.setAdapter(sca);
mylistview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(mContext,"Your clicked on ID " + String.valueOf(id),Toast.LENGTH_SHORT).show();
}
});
} else {
sca.swapCursor(mCsr);
}
}
// JUST TO ADD SOME TEST DATA IF NOE EXISTS
private void addSomeData() {
if (DatabaseUtils.queryNumEntries(myDB.getWritableDatabase(),DatabaseHelper.TBL_TERM) < 1) {
myDB.addTerm("Term 1","2019-01-01","2019-03-31");
myDB.addTerm("Term 2","2019-04-01","2019-06-30");
myDB.addTerm("Term 3","2019-07-01","2019-08-31");
myDB.addTerm("Term 4","2019-09-01","2019-12-31");
}
}
//ADDED as simply calling manageListView will rebuild the list according to the data
// as such when the activity is returned to from another the List is rebuilt
// (basically the Cursor mCsr is overwritten and then as the SimpleCursorAdapter sca is instantiated
// the Cursor is swappped)
@Override
protected void onResume() {
super.onResume();
manageListView();
}
}
Результаты
Fisrt (динамические TextViews): -
![enter image description here](https://i.stack.imgur.com/0WfuB.png)
Альтернатива приводит к: -
![enter image description here](https://i.stack.imgur.com/WpJbF.png)
В обоих случаях нажатие на строку приводит к поджариванию идентификатора (не пытаясь поймать тост).
- Оба были также проверены на Android 10