База данных SQLite в CustomListview с несколькими элементами - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь создать приложение ToDo, которое отображает введенное пользователем имя задачи и описание задачи в пользовательском элементе списка.Эти данные будут поступать из базы данных SQLite.

Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как поместить и имя задачи, и описание задачи в этот элемент пользовательского списка, поскольку все попытки, которые я сделал, просто показываютпустой экран.

Это пользовательский list_item.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"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="@color/colorWhite">

        <TextView
            android:id="@+id/task_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginStart="55dp"
            android:layout_marginTop="25dp"
            android:text="TextView" />

        <View
            android:id="@+id/viewbutton"
            android:layout_width="16dp"
            android:layout_height="16dp"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginStart="21dp"
            android:layout_marginTop="24dp"
            android:background="@layout/round" />

    <TextView
        android:id="@+id/task_desc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/task_name"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="55dp"
        android:layout_marginTop="53dp"
        android:layout_marginBottom="10dp"
        android:text="Undefined"
        android:textStyle="bold" />

</RelativeLayout>

Вот мой DatabaseHelper.java

public class  DatabaseHelper extends SQLiteOpenHelper {
private static final String TAG = "DatabaseHelper";
private static final String TABLE_NAME = "task_table";
private static final String COL1 = "ID";
private static final String COL2 = "name";
private static final String COL3 = "priority";
private static final String COL4 = "desc";

public DatabaseHelper(Context context) {
    super(context, TABLE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COL2 +" TEXT, " + COL3 + " INTEGER, '" + COL4 + "' TEXT )";
    db.execSQL(createTable);
}

@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
}

public boolean addData(String item, String desc) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL2, item);
    contentValues.put(COL4, desc);

    Log.d(TAG, "addData: Adding " + item + " to " + TABLE_NAME);
    long result = db.insert(TABLE_NAME, null, contentValues);

    if (result == -1) {
        return false;
    } else {
        return true;
    }
}
    public ArrayList<String> getTaskList(){
        ArrayList<String> taskList = new ArrayList<>();
        SQLiteDatabase td = this.getReadableDatabase();
        Cursor cursor = td.query(TABLE_NAME,new String[]{COL2},null,null,null,null,null);
        while(cursor.moveToNext()){
            int index = cursor.getColumnIndex(COL2);
            taskList.add(cursor.getString(index));
        }
        cursor.close();
        td.close();
        return taskList;
    }
    public Cursor getData(){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "SELECT * FROM " + TABLE_NAME;
        Cursor data = db.rawQuery(query, null);
        return data;
    }
    public Cursor getItemID(String name){
        SQLiteDatabase db = this.getWritableDatabase();
        String query = "SELECT " + COL1 + " FROM " + TABLE_NAME +
                " WHERE " + COL2 + " = '" + name + "'";
        Cursor data = db.rawQuery(query, null);
        return data;
    }

А вот мой ListDataActivity.java

public class ListDataActivity extends AppCompatActivity {

private static final String TAG = "ListDataActivity";

DatabaseHelper mDatabaseHelper;
TextView mTaskName;
TextView mTaskDesc;
CustomAdapter customAdapter;
ArrayAdapter<String> adapter;
private ListView mListView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list_layout);
    mListView = (ListView) findViewById(R.id.listView);
    mDatabaseHelper = new DatabaseHelper(this);
    mTaskDesc = (TextView) findViewById(R.id.task_desc);
    mTaskName = (TextView) findViewById(R.id.task_name);

    populateListView();
}

private void populateListView() {
    Log.d(TAG, "populateListView: Displaying data in the ListView.");
    //get the data and append to a list
    ArrayList<String> taskList = mDatabaseHelper.getTaskList();
    if (adapter == null) {
        adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.task_name, taskList);
        mListView.setAdapter(adapter);
    } else {
        adapter.clear();
        adapter.addAll(taskList);
        adapter.notifyDataSetChanged();
    }

Я с удовольствием уточню что-нибудь из этого, если то, что я спрашиваю, неясно, и большое спасибо заранее!

Я новичок в Java, поэтому, если я допустил какие-то глупые ошибки, пожалуйста, будьте осторожны со мной!

Ответы [ 2 ]

0 голосов
/ 21 октября 2018
public ArrayList<String> getTaskList(){
    List<TaskList> taskList = new ArrayList<>();
    SQLiteDatabase td = this.getReadableDatabase();
    Cursor cursor = td.query(TABLE_NAME,new String[]{COL2},null,null,null,null,null);
    while(cursor.moveToNext()){
        int index = cursor.getColumnIndex(COL2);
        int desc = cursor.getColumnIndex(COL4);
       taskList.add(cursor.getString(index),cursor.getString(desc));
    }
    cursor.close();
    td.close();
    return taskList;
}

private void populateListView() {
ArrayAdapter<TaskList> adapter;
List<TaskList> taskList = new ArrayList<>();
//get the data and append to a list
 taskList = mDatabaseHelper.getTaskList();
if (adapter == null) {
    adapter = new ArrayAdapter<TaskList>(this, R.layout.list_item,taskList);
    mListView.setAdapter(adapter);
} else {
    adapter.clear();
    adapter.addAll(taskList);
    adapter.notifyDataSetChanged();
}


public class TaskList {

private String TaskName;
private String TaskDesc;

public TaskList(String taskName, String taskDesc) {
    TaskName = taskName;
    TaskDesc = taskDesc;
}

public String getTaskName() {
    return TaskName;
}

public void setTaskName(String taskName) {
    TaskName = taskName;
}

public String getTaskDesc() {
    return TaskDesc;
}

public void setTaskDesc(String taskDesc) {
    TaskDesc = taskDesc;
}
}

см. Обновленные методы, а также новый класс моделей для списка

0 голосов
/ 21 октября 2018

Используя стандартный ArrayAdapter, он просто использует метод toString объекта, чтобы заполнить представление в списке.Нет возможности передавать несколько методов для нескольких представлений.

Вы можете создать собственный адаптер (подкласс ArrayAdapter) или, поскольку данные поступают из базы данных SQLite, вы можете использовать адаптер курсора, например SimpleCursorAdapter.Последний предназначен для отображения нескольких столбцов.

Конструктор для SimpleCursorAdapter имеет вид SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags)

  • Обратите внимание, что существует аналогичный конструктор (за исключением 6-го параметра, но это не рекомендуется).

4-й и 5-й параметры используются для указания пар значений (string и int), каждая пара состоит из имени столбца и идентификатора представления (из макета (2-й параметр))в который будут помещены данные из столбца.

  • Примечание!Для CursorAdapters требуется имя столбца _id, а этот столбец должен иметь псевдоним rowid (например, _id INTEGER PRIMARY KEY или _id INTEGER PRIMARY KEY AUTOINCREMENT).Если такого столбца не существует, вы можете создать его в запросе, используя rowid AS _id в качестве одного из столбцов, например, SELECT *, rowid AS _id FROM mytable (обратите внимание, что это не будет работать, если таблица была определена без WOWHOUT ROWID).

    • Значение _id (длинный 4-й параметр) передается в методы адаптера onItemClick и onItemLongClick, поэтому и требуется.
...