android - 如何在 2 个活动之间传递数据并将其显示在回收站视图中?
问题描述
我尝试在 2 个活动之间传递 SQLite 数据并将其显示在回收站视图中。我运行该应用程序,但它停止了。我怎样才能使这项工作?
活动:
1.SQLite数据库
数据库处理程序.java
public class DatabaseHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "tasksManager";
private static final String TABLE_TASKS = "tasks";
private static final String KEY_TASK_ID = "_id";
private static final String KEY_TASK_NAME = "name";
private static final String KEY_TASK_DATE = "date";
public DatabaseHandler(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TASKS_TABLE = "CREATE TABLE " + TABLE_TASKS + "(" + KEY_TASK_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
KEY_TASK_NAME + " TEXT," + KEY_TASK_DATE + " TEXT" + ")";
db.execSQL(CREATE_TASKS_TABLE);}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS tasks" + TABLE_TASKS);
onCreate(db);
}
public void addTask(Task task){
SQLiteDatabase db= this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_TASK_NAME, task.getTaskName());
values.put(KEY_TASK_DATE, task.getTaskDate());
db.insert(TABLE_TASKS, null, values);
db.close();
}
public ArrayList<Task> getAllTasks(){
String[] columns = {
KEY_TASK_ID,
KEY_TASK_NAME,
KEY_TASK_DATE};
ArrayList<Task> taskList = new ArrayList<>();
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_TASKS,
columns,
null, null, null, null, null);
if(cursor != null) {
cursor.moveToFirst();
do {
Task task = new Task(
parseInt(cursor.getString(0)),
cursor.getString(1),
cursor.getString(2));
taskList.add(task);
}
while (cursor.moveToNext());
}
cursor.close();
db.close();
return taskList;
}
2.我想从中获取数据的活动
AddTaskActivity.java
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import java.util.ArrayList;
public class AddTaskActivity extends AppCompatActivity {
TextView addNewTask, setStartTime, setEndTime;
EditText addTaskName;
TimePicker timePicker1, timePicker2;
int hour1, minute1;
int hour2, minute2;
String theNewTask;
Button addTaskButton;
TasksListActivity tla;
DatabaseHandler dth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_task);
dth = new DatabaseHandler(this);
addNewTask = findViewById(R.id.addNewTask);
setStartTime = findViewById(R.id.setStartTime);
setEndTime = findViewById(R.id.setEndTime);
addTaskName = findViewById(R.id.addTaskName);
timePicker1 = findViewById(R.id.timePicker1);
timePicker2 = findViewById(R.id.timePicker2);
addTaskButton = findViewById(R.id.addTaskButton);
addTaskButton.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = addTaskName.getText().toString();
Intent intent = new Intent(AddTaskActivity.this, TasksListActivity.class);
Task task = new Task();
task.setTaskName(name);
task.setTaskDate("date");
dth.addTask(task);
intent.putExtra("name", name);
startActivity(intent);
}
}
);
}
}
3.我要显示数据的活动
任务列表活动.java
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.MenuItem;
import android.widget.TextView;
import java.util.ArrayList;
public class TasksListActivity extends AppCompatActivity {
RecyclerView recyclerView;
TaskAdapter taskAdapter;
LinearLayoutManager layoutManager;
ArrayList<Task> tasksList;
DatabaseHandler dth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tasks_list);
BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavigation);
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.taskListItem:
Intent intent1 = new Intent(TasksListActivity.this, TasksListActivity.class);
startActivity(intent1);
break;
case R.id.addTasks:
Intent intent5 = new Intent(TasksListActivity.this, AddTaskActivity.class);
startActivity(intent5);
break;
case R.id.noteListItem:
Intent intent2 = new Intent(TasksListActivity.this, NotesListActivity.class);
startActivity(intent2);
break;
}
return true;
}
});
recyclerView = findViewById(R.id.recyclerView);
tasksList = new ArrayList<>();
taskAdapter = new TaskAdapter(tasksList, TasksListActivity.this);
layoutManager = new LinearLayoutManager(getApplicationContext());
dth = new DatabaseHandler(this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(taskAdapter);
Bundle bundle = getIntent().getExtras();
String name = bundle.getString("name");
getDataFromSQLiteDatabase();
}
private void getDataFromSQLiteDatabase(){
new AsyncTask<Void, Void, Void>(){
@Override
protected Void doInBackground(Void... params){
tasksList.clear();
tasksList.addAll(dth.getAllTasks());
return null;
}
@Override
protected void onPostExecute(Void aVoid){
super.onPostExecute(aVoid);
taskAdapter.notifyDataSetChanged();
}
}.execute();
}
}
编辑:我改变了 Bundle bundle = getIntent().getExtras(); 字符串名称 = bundle.getString("name");
to String name = getIntent().getStringExtra("name");
Logcat 显示此错误:
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:353)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:468)
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
at com.example.android.todolistapp.DatabaseHandler.getAllTasks(DatabaseHandler.java:182)
at com.example.android.todolistapp.TasksListActivity$2.doInBackground(TasksListActivity.java:74)
at com.example.android.todolistapp.TasksListActivity$2.doInBackground(TasksListActivity.java:70)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
解决方案
只需更换
Bundle bundle = getIntent().getExtras();
String name = bundle.getString("name");
有了这个
String name =getIntent().getStringExtras("name")
推荐阅读
- reactjs - 没有找到反应浏览器路由器模块?
- php - 无法使用 file_get_contents 获取页面内容
- javascript - 通过 html 中的 Knockout 循环将值存储在变量中
- python - 以毫秒为单位获取总运行时间
- awk - grep 无法从 CSV 文件中删除模式
- react-native - 在 MainActivity.java 中找不到 onCreate()
- vb.net - 如何在 Datagridview 中获取与不同列值相关的列的不同值和列摘要
- java - GWT 编译无法运行程序 CreateProcess 错误=206
- android - 如何在独立于生命周期的类中处理 Observables?
- tensorflow - 将张量从较小的形状平铺到较大的形状