5

我目前面临一个愚蠢的问题。我有一个带有自定义适配器(扩展 CursorAdapter)的列表视图。

它显示一个带有不同按钮的自定义视图(分享、点赞、删除)。对于删除按钮,它有一个警告对话框来确认删除该项目。当用户确认时,该项目将从数据库中删除。直到这里一切正常。

我的问题是,如何使用新数据集有效地更新列表视图?

非常感谢你的帮助。

代码:

public class CommentCursorAdapter extends CursorAdapter{
    (...)
    @Override
    public void bindView(View view, Context arg1, Cursor cursor) {
    (...)
        holder.list_item_comment_discard_btn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            final String _id = v.getTag().toString();
            AlertDialog.Builder builder = new    AlertDialog.Builder(mActivity);
            builder.setTitle("Delete");
            builder.setMessage("Do you want to delete "+_id);
            builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // User clicked OK button
                    DBAdapter dba = new DBAdapter(mActivity);
                    dba.open();
                    dba.remove(_id);
                    Log.i("TAAG", "removed: "+_id);
                    dba.close();    

                // How to update the listview ??                                    
                }
            });
            builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // User cancelled the dialog
                }
            });

            AlertDialog d = builder.create();
            d.show();
        }
        });
        holder.list_item_comment_discard_btn.setTag(_id);
        (...)
    }
    (...)
}
4

4 回答 4

9

如果您使用 LoaderManager 来管理光标的生命周期(这是正确的方法),您只需要调用 restartLoader 然后(重新)在 onLoadFinished 中设置适配器的光标。您的列表视图将重新加载更新的数据。

Activity 或 Fragment 中游标的管理应该以非常简单直接的方式完成:

  • 为了初始化你的光标:

    public void onCreate(Bundle savedInstanceState) { // or onStart
    // ...
    this.getLoaderManager().initLoader(MY_CURSOR_ID, null, this);
    // ...
    }
    
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    // TODO: create a cursor loader that will load your cursor here
    }
    
    public void onLoadFinished(Loader<Cursor> arg0, final Cursor arg1) {
    // TODO: set your cursor as the cursor of your adapter here;
    }
    
    public void onLoaderReset(Loader<Cursor> arg0) {
    // TODO: set null as the cursor of your adapter and 'free' all cursor
    // references;
    }
    
  • 然后,当您需要重新加载数据时:

    this.getLoaderManager().restartLoader(MY_CURSOR_ID, null, this);
    
于 2013-03-06T04:49:42.590 回答
1

打电话 cursor.requery(); notifyDataSetChanged();

如果您想要真正的性能,请使用AsyncTaskLoader

于 2013-03-05T15:17:03.893 回答
1

只需重新查询Cursor这样的:

public void onClick(DialogInterface dialog, int id) {
    // User clicked OK button
    DBAdapter dba = new DBAdapter(mActivity);
    dba.open();
    dba.remove(_id);
    Log.i("TAAG", "removed: "+_id);
    dba.close();    
    cursor.requery();
    notifyDataSetChanged();                                   
}   

然后调用notifyDataSetChanged()告诉Adapter数据已经改变,它必须重新构建适配器。

如果重新查询需要很长时间,这将是一项密集的操作。考虑在另一个线程中进行。

于 2013-03-05T15:17:22.797 回答
1

删除数据库中的项目后,调用notifyDataSetChanged你的CommentCursorAdapter,授予你正在使用的这个匿名内部类,你需要一个final引用,this因为它在你的CursorAdapter. 这应该会触发您的ListView.

http://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()

于 2013-03-05T15:18:08.050 回答