Передача данных из listview при помощи intent
Есть список, который получает данные из базы. Хочу, чтобы по нажатию на элемент списка данные из него передавались на след активити через intent.putExtra. Но что мне нужно передать?
MainActivity (В нем listView)
public class MainActivity extends AppCompatActivity {
ListView listView;
DataBase dataBase;
SQLiteDatabase sqLiteDatabase;
FloatingActionButton fabMain;
MySimpleAdapter simpleCursorAdapter;
Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fabMain = findViewById(R.id.fab_main);
listView = findViewById(R.id.rv_list);
dataBase = new DataBase(this);
sqLiteDatabase = dataBase.getWritableDatabase();
//переход на след активити и добавления в базу
fabMain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
//вывод данных из базы
cursor = sqLiteDatabase.query(dataBase.DATABASE_TABLE, null, null, null, null, null, null);
simpleCursorAdapter = new MySimpleAdapter(MainActivity.this, cursor, 0);
listView.setAdapter(simpleCursorAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MainActivity.this, TaskActivity.class);
//на этом месте проблема
//intent.putExtra("value1", .....)
startActivity(intent);
}
});
}
@Override
protected void onRestart() {
super.onRestart();
cursor = sqLiteDatabase.query(dataBase.DATABASE_TABLE, null, null, null, null, null, null);
simpleCursorAdapter = new MySimpleAdapter(MainActivity.this, cursor, 0);
listView.setAdapter(simpleCursorAdapter);
}
@Override
protected void onDestroy() {
cursor.close();
dataBase.close();
super.onDestroy();
}
}
Адаптер
public class MySimpleAdapter extends CursorAdapter {
DataBase dataBase;
public MySimpleAdapter(Context context,Cursor c, int flags) {
super(context, c, flags);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView tvTitle = view.findViewById(R.id.tv_title_item_list);
TextView tvText = view.findViewById(R.id.tv_text_item_list);
String title = cursor.getString(cursor.getColumnIndex(dataBase.KEY_TITLE));
String text = cursor.getString(cursor.getColumnIndex(dataBase.KEY_TEXT));
tvTitle.setText(title);
tvText.setText(text);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.item_list, parent, false);
}}
Ответы (2 шт):
Через интент нужно передавать только id кликнутой записи в БД (это четвертый параметр long id колбэка onItemClick()), все остальные данные нужно получать уже в новой активити по этому id, новым запросом в бд.
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(MainActivity.this, TaskActivity.class);
intent.putExtra("value1", id) // передаем 4 параметр возвращаемый onItemClick()
startActivity(intent);
}
});
при этом таблица, в которую делается запрос, должна содержать колонку с именем _id (не id, ID, Id, _ID и т.п.) и параметрами INTEGER PRIMARY KEY AUTOINCREMENT. Так же эта колонка должна быть включена в выборку курсора
Решил эту задачу как мне предложил @pavlofff
Передал Lond id через intent.putExtra("id", id); и уже в следующем активити вновь обратился к базе по id
//Получение заметки по id из баззы
final String selection = "_id = ?";
final String[] selectionArgs = new String[] {valueId};
cursor = sqLiteDatabase.query(DataBase.DATABASE_TABLE, null, selection, selectionArgs, null, null, null);
if(cursor.moveToFirst()){
a = cursor.getString(cursor.getColumnIndex(dataBase.KEY_TITLE));
b = cursor.getString(cursor.getColumnIndex(dataBase.KEY_TEXT));
tvTitleActivityTask.setText(a);
tvTextActivityTask.setText(b);
} else
Toast.makeText(TaskActivity.this, "Не получилось", Toast.LENGTH_LONG).show();
//Удаление заметки из базы
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sqLiteDatabase.delete(dataBase.DATABASE_TABLE, selection, selectionArgs);
Toast.makeText(TaskActivity.this, "Заметка удалена!", Toast.LENGTH_SHORT).show();
finish();
}
});