【发布时间】:2018-04-06 10:39:50
【问题描述】:
我正在尝试创建一个简单的任务应用程序,用于在 android 上学习 arrayadapter 和 sql db。
我在将 ArrayAdapter 与我的任务类一起使用和设计自定义列表视图 xml 以显示表格等任务时遇到问题。
我在布局文件夹中创建了 2 个 xml 文件
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.xcrix.taskmanager.MainActivity">
<ListView
android:id="@+id/tasks"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
我无法将新任务部分添加到 activity_main.xml,因为当我放置一个列表视图时,它会自动展开所有屏幕。我需要在 main relativelayout 标签内添加另一个布局吗?
另一个布局文件是row.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/taskItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="48dp"
android:layout_marginStart="48dp"
android:layout_marginTop="33dp"
android:text="TextView" />
<Button
android:id="@+id/btnDelete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_marginRight="5dp"
android:text="Delete"
android:onClick="deleteTask"
/>
</RelativeLayout>
数据库类:
public class database extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "taskManager";
private static final String TABLE_TASKS = "tasks";
private static final String KEY_ID = "id";
private static final String KEY_NAME = "name";
private static final String KEY_DESC = "desc";
private static final String KEY_DATE = "date";
public database(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TASKS_TABLE = "CREATE TABLE " + TABLE_TASKS + "("
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
+ KEY_DESC + " TEXT," + KEY_DATE+"TEXT,"+ ")";
db.execSQL(CREATE_TASKS_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_TASKS);
onCreate(db); //create tables again
}
void addTask(Task task) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, task.getName());
values.put(KEY_DESC, task.getDesc());
values.put(KEY_DATE, task.getDate());
db.insert(TABLE_TASKS, null, values);
db.close();
}
public List<Task> getTasks() {
List<Task> taskList = new ArrayList<Task>();
String selectQuery = "SELECT * FROM " + TABLE_TASKS;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
Task task = new Task();
task.setId(Integer.parseInt(cursor.getString(0)));
task.setName(cursor.getString(1));
task.setDesc(cursor.getString(2));
task.setDate(cursor.getString(3));
taskList.add(task);
} while (cursor.moveToNext());
}
return taskList;
}
public void deleteTask(Task task) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_TASKS, KEY_ID + " = ?",
new String[] { String.valueOf(task.getId()) });
db.close();
}
}
任务类:
public class Task {
int id;
String name;
String desc;
String date;
public Task(){
this.id = id;
this.name = name;
this.desc = desc;
this.date = date;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
public String getDate() {
return date;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setDesc(String desc) {
this.desc = desc;
}
public void setDate(String date) {
this.date = date;
}
}
MainActivity 类:
public class MainActivity extends AppCompatActivity {
database helper;
ArrayAdapter<String> adapter;
ListView tasklist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helper = new database(this);
tasklist = (ListView) findViewById(R.id.tasks);
displayTasks();
}
public void displayTasks(){
List<Task> taskList = helper.getTasks();
if(adapter == null){
//adapter = new ArrayAdapter<Task> im not sure how to implement this
tasklist.setAdapter(adapter);
}else{
adapter.clear();
//adapter.addAll(); not sure what to write inside addAll
adapter.notifyDataSetChanged();
}
}
}
如你所见,我正在尝试在 mainactivity 中编写 displayTasks 方法,但我做不到
【问题讨论】:
-
创建自定义适配器,扩展基本适配器并使用它
标签: android android-layout android-arrayadapter