【问题标题】:How make a synchronization with ListView from a dialog window?如何从对话框窗口与 ListView 同步?
【发布时间】:2018-02-13 08:24:13
【问题描述】:

这是我的代码-

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, final int position, final long id) {

        builder1 = new AlertDialog.Builder(context);
        alert1 = builder1.create();
        layoutInflater1 = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        layout1 = layoutInflater1.inflate(R.layout.alert_one, null);
        alert1.setView(layout1);

        buttonAlert_oneDelete = (Button) layout1.findViewById(R.id.buttonAlert_oneDelete);
        buttonAlert_oneUpdate = (Button) layout1.findViewById(R.id.buttonAlert_oneUpdate);
        buttonAlert_oneCancel = (Button) layout1.findViewById(R.id.buttonAlert_oneCancel);

        buttonAlert_oneDelete.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
                funDelete(id);
                simpleCursorAdapter.notifyDataSetChanged();
                alert1.cancel();
            }
        });

        buttonAlert_oneCancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                alert1.cancel();
            }
        });     
        alert1.show();
    }
});

funDelete方法

private void funDelete(long id) {
  db = abcDbHelper.getReadableDatabase(); 
  db.delete(AbcDbContract.TableWords.TABLE_NAME,AbcDbContract.TableWords.COLUMN_NAME_ID + " = " + String.valueOf(id), null); 
}

嗨!从数据库中删除行后,方法 notifyDataSetChanged() 不会立即 ListView。这是怎么做的?非常感谢。

【问题讨论】:

  • 你能再解释一下你的问题吗..
  • 显示你的函数删除和适配器的初始化语句..
  • 我猜这是因为从数据库中删除是一个异步函数。如果在调用funDelete 之后再调用notifyDataSetChanged,那么此时异步函数可能还没有完成。在funDelete 内调用notifyDataSetChanged,您可以确保删除操作已完成。
  • 发布您的funDelete(id) 方法代码。你从哪里得到id
  • 当我在此对话框窗口中按下“DELETE”按钮时,ListView 现在必须更改

标签: java android listview dialog synchronization


【解决方案1】:

Adapter 不知道您的数据库表。 Adapter 只知道它的数据源是ListArray。因此,在这种情况下,您必须从数据库重新加载数据并更新适配器。

 buttonAlert_oneDelete.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    funDelete(id);
    // reload datafrom Database
    // update datasource of the  simpleCursorAdapter 
    simpleCursorAdapter.notifyDataSetChanged();
    alert1.cancel();
   }
});

如果您使用CursorLoader,则无需手动查询。 CursorLoader 自动注册 ContentObserver 以在数据更改时触发重新加载。您只需在任何更新/插入/删除操作后致电getContext().getContentResolver().notifyChange(uri, null);

检查this回答如何实现它。

【讨论】:

  • 阿布优素福非常感谢您!我提出这个问题。你可以看here
  • 不懂俄语:p
猜你喜欢
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多