ListView在swapCursor之后没有正确更新CursorAdapter

时间:2013-12-11 06:28:40

标签: android android-listview android-cursoradapter

我有一个非常基本的CursorAdapter实现。我只是覆盖了newView和bindView(下面的代码)。

我正在做的是在表中添加一行,创建一个查询表的新游标(使用新行),更改适配器中的光标,然后通知数据更改。

正在发生的事情是将新行添加到ListView(如预期的那样),但数据镜像列表中的第一项。有趣的部分:当我改变方向或只是重新加载片段(通过标签更改)时,列表数据是正确的。

我已经创建了一个简单的解决方法,那就是简单地更改游标并再次调用list.setAdapter。这使得它更新得很好。

这是一个不错的计划,还是有办法在没有解决方法的情况下解决这个问题?

CODE:

的CursorAdapter:

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    return inflater.inflate(R.layout.list_item_encounters, parent, false);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    int rowID = cursor.getInt(GameTable.COLUMN_ID.getNum());
    // set the list item info from the cursor
    // set the encounter title
    TextView t = (TextView)view.findViewById(R.id.encounter_creature_list_name);
    t.setText(String.format(t.getText().toString(), rowID + ""));

    // set the creature count
    int count = EncounterTable.getCreatureCount(GameSQLDataSource.getDatabase(), rowID);
    t = (TextView)view.findViewById(R.id.encounter_creature_list_hp);
    t.setText(String.format(t.getText().toString(), count +""));
}

我调试了getView方法,从我的Cursor返回的数据是准确的,TextViews正在获取正确的数据,它只是显示第一个项目的镜像。

光标更改(未正确刷新):

private void refreshList(){
    Cursor c = GameTable.query(GameSQLDataSource.getDatabase());

    EncounterAdapter adapter = (EncounterAdapter) mList.getAdapter();
    adapter.changeCursor(c);
    adapter.notifyDataSetChanged();
}

光标更改(解决方法):

private void refreshList(){
    Cursor c = GameTable.query(GameSQLDataSource.getDatabase());

    EncounterAdapter adapter = (EncounterAdapter) mList.getAdapter();
    adapter.changeCursor(c);
    mList.setAdapter(adapter);
}

0 个答案:

没有答案