0

この質問に関連する 50 近くのリンクを読みましたが、コードがまだ機能していません。

SimpleCursorAdapter クラスを拡張するカスタム アダプターがあり、そのアダプターを使用して onCreate メソッドの ListView に入力します。

private void populateListView()
{
    String[] from = new String[] { SchemaHelper.TASK_DESCRIPTION, SchemaHelper.TASK_CREATED_ON, SchemaHelper.TASK_ID };

    int[] to = new int[] {R.id.lv_row_description, R.id.lv_row_created_on};

    tasksCursor = schemaHelper.getTasks();

    startManagingCursor(tasksCursor);

    tasksAdapter = new TasksAdapter(this, R.layout.tasks_listview_row, tasksCursor, from, to);

    setListAdapter(tasksAdapter);
}

アプリは単純なタスク マネージャーです。ユーザーが setListAdapter() を再度呼び出さずに新しいタスクを送信したときに、ListView の内容を更新したいと考えています。

私はnotifyDataSetChanged(UIスレッドで実行)、無効化、再クエリ(非推奨)...ほとんどすべてを試しました。

私は何か間違ったことをしていますか?

編集:これは、データベースに新しいタスクを追加する方法です

private void addTask(String description)
{
    String message = "";

    schemaHelper.open();

    if(schemaHelper.isAlreadyInDatabase(description))
    {
        message = getString(R.string.task_already_exists);
    }
    else
    {
        message = getString(R.string.task_succesfully_added);

        schemaHelper.insertTask(description);

        populateListView();

        newTask.setText("");
    }

    schemaHelper.close();

    Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}

アダプタークラス:

private class TasksAdapter extends SimpleCursorAdapter
{
    private LayoutInflater layoutInflater;

    private Cursor cursor;

    public TasksAdapter(Context context, int layout, Cursor c, String[] from, int[] to)
    {
        super(context, layout, c, from, to);

        cursor = c;

        cursor.moveToFirst();

        layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        if(cursor.getPosition() < 0)
        {
            cursor.moveToFirst();
        }
        else
        {
            cursor.moveToPosition(position); // Here throws the error
        }

        View row = layoutInflater.inflate(R.layout.tasks_listview_row, null);

        TextView description = (TextView) row.findViewById(R.id.lv_row_description);

        TextView createdOn = (TextView) row.findViewById(R.id.lv_row_created_on);

        description.setText(cursor.getString(cursor.getColumnIndexOrThrow(SchemaHelper.TASK_DESCRIPTION)));

        createdOn.setText(getString(R.string.added_on) + " " + TaskHelper.formatDateWithSuffix(cursor.getString(cursor.getColumnIndexOrThrow(SchemaHelper.TASK_CREATED_ON))));

        return row;
    }
}
4

2 に答える 2

0

私は taskCursor と taskAdapter の多くを知りませんが、ArrayAdapter を使用したと思います。自分のコードをよく見て、独自の結論を出してください。

               //LISTVIEW database CONTATO
    ListView user = (ListView) findViewById(R.id.lvShowContatos);
    //String = simple value ||| String[] = multiple values/columns
    String[] campos = new String[] {"nome", "telefone"};

    list = new ArrayList<String>();
    Cursor c = db.query( "contatos", campos, null, null, null, null, "nome" + " ASC ");
    c.moveToFirst();
    String lista = "";
    if(c.getCount() > 0) {
        while(true) {
           list.add(c.getString(c.getColumnIndex("nome")).toString());
            if(!c.moveToNext()) break;
        }
    }

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, list);

    user.setAdapter(adapter);
于 2012-09-13T18:30:24.903 に答える
0

使用したくない場合はrequery()、同じクエリで新しい Cursor を渡すだけです。

tasksCursor.close();
tasksCursor = schemaHelper.getTasks();
startManagingCursor(tasksCursor);
tasksAdapter.changeCursor(tasksCursor);

あなたが電話をかけるとき、addTask()あなたはすでにpopulateListView()一度電話をかけていると思います。これに変更addTask()してみてください:

private void addTask(String description)
{
    String message = "";

    schemaHelper.open();

    if(schemaHelper.isAlreadyInDatabase(description))
    {
        message = getString(R.string.task_already_exists);
    }
    else
    {
        message = getString(R.string.task_succesfully_added);

        schemaHelper.insertTask(description);

        // Remove call to populateListView(), just update the Cursor 
        tasksCursor.close();
        tasksCursor = schemaHelper.getTasks();
        startManagingCursor(tasksCursor);
        tasksAdapter.changeCursor(tasksCursor);

        newTask.setText("");
    }

    schemaHelper.close();

    Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}

これが「うまくいかない」場合は、より具体的にしてください。エラーをスローしていますか?


アダプターで少しやりすぎています。Google Talks で Android の Romain Guy がアダプタとgetView(). ただし、TextView に特別な文字列を 1 つだけ渡したいので、createdOn非常に異なることをしてオーバーライドしましょうsetViewText()

これを試して:

public class TasksAdapter extends SimpleCursorAdapter {
    String prefix;
    public TasksAdapter(Context context, int layout, Cursor cursor, String[] from, int[] to) {
        super(context, layout, cursor, from, to);
        // This is constant so set it once and consider adding the space to the end of the String in strings.xml
        prefix = getString(R.string.added_on) + " ";
    }

    @Override
    public void setViewText(TextView v, String text) {
        if(v.getId() == R.id.lv_row_created_on)
            v.setText(prefix + TaskHelper.formatDateWithSuffix(text));
        else
            super.setViewText(v, text);
    }
}

残りのデータは、SimpleCursorAdapter の既存のメソッドで処理されます。

于 2012-09-13T18:36:25.223 に答える