Android: SimpleCursorAdapter и ListView

Привет, я начал программировать список дел на Android (в eclipse), который синхронизируется с задачами Google и добавляет задачи из вашей учетной записи Google. Я реализовал действительно простую базу данных (согласно этому руководству: Учебное пособие по SQLITE). Проект содержит одно действие, которое реализует только listView и кнопку, которая позволяет ему добавлять задачи (родительское действие). При нажатии кнопки запускается новое действие через «startActivityForResult», и вы можете ввести имя и категорию (дочерний элемент). Activity) Затем эти две строки передаются в родительское действие и добавляются в базу данных, которая инициализируется в родительском действии. Теперь нужно создать список и установить SimpleCursorAdapter; это момент, когда приложение вылетает, на эмуляторе и на моем андроиде удобно. Вот фрагмент кода стартовой активности:

 @Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    initDB();
    initUI();
}

public void initUI()
{
    Log.w(TAG, "initUI()");
    populateToDoList();

    listView = (ListView) findViewById(R.id.tasklist);
    addButton = (Button) findViewById(R.id.addTask);

    addButton.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View arg0) 
        {
            // TODO Auto-generated method stub
            Intent i = new Intent(RememberMe.this, AddTask.class);
            startActivityForResult(i, REQUEST_CODE);
    }   });
}

public void initDB()
{
    toDoDBAdapter = new ToDoDBAdapter(RememberMe.this);
    toDoDBAdapter.open();
}

private void populateToDoList() 
{

    Log.w(TAG, "populateToDoList()");

    dbCursor = toDoDBAdapter.getAllToDoItemsCursor();
    Log.w(TAG, "getAllToDoItemsCursor()");

    startManagingCursor(dbCursor);
    Log.w(TAG, "startManagingCursor()");

    String [] columns = { ToDoDBAdapter.KEY_NAME};
    int [] to = { android.R.id.text1 };
    Log.w(TAG, "Sring from int to");

    simpleCursor = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, dbCursor, columns, to);
    Log.w(TAG, "new SimpleCursorAdapter()");

    listView.setAdapter(simpleCursor);
    Log.w(TAG, "setAdapter()");

    simpleCursor.notifyDataSetChanged();    

}

private void updateList() 
{

    dbCursor.requery();
    simpleCursor.notifyDataSetChanged();

}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if(resultCode == REQUEST_CODE)
    {
        String taskName = data.getStringExtra("taskName");
        String taskCategory = data.getStringExtra("taskCategory");

        toDoDBAdapter.createTask(taskName, taskCategory);

        updateList();

        Toast.makeText(this, "Aufgabe hinzugefügt", Toast.LENGTH_LONG).show();
    }
}

@Override
public void onDestroy() 
{
    super.onDestroy();
    toDoDBAdapter.close();
}
}

Он останавливается на

listView.setAdapter(simpleCursor);
Log.w(TAG, "setAdapter()");

Я понятия не имею, почему или в чем проблема; Я читал, что есть проблемы с эмулятором в 64-битной системе, но код не работает ни на моем удобном, ни на моем удобном, и реализация списков и установка простого курсора не должны быть такими сложными O.o Вот логарифм: LogCat


person vein    schedule 18.11.2011    source источник
comment
попробуйте отладить результаты функций, используемых в populateToDoList()   -  person    schedule 19.11.2011


Ответы (1)


Вы проверили, что listView на самом деле не является нулевым? Отладьте свой код, пройдите весь путь до listView.setAdapter(simpleCursor); и наведите указатель мыши на listView, чтобы увидеть, является ли он нулевым.

РЕДАКТИРОВАТЬ: вы обнаружили, что на самом деле он был нулевым, вот наиболее распространенные причины, которые я нашел:

listView = (ListView) findViewById(R.id.tasklist);

R.id.tasklist чувствителен к регистру, убедитесь, что в вашем XML это не @+id/taskList или что-то подобное, иначе это вернет null

Также убедитесь, что оно написано правильно, так как это может быть просто опечатка.

person Jack    schedule 18.11.2011
comment
Прежде всего, спасибо за ваш ответ, и да, вы правы, он равен нулю :-$ а, ладно, я запускаю populateList() до того, как представление будет инициализировано.. глупо O.o - person vein; 19.11.2011
comment
Обязательно отметьте большую галочку, если это был ответ, который решил вашу проблему :). Это слева. - person Jack; 19.11.2011
comment
спасибо за вашу помощь, в одиночку я бы не проверил, если бы он был нулевым - person vein; 19.11.2011
comment
Нет проблем, эти NullPointerException, как правило, легче всего понять, вам просто нужно использовать отладчик :). Теперь вы знаете, как выследить одного из них. - person Jack; 19.11.2011