【问题标题】:refresh ListView after delete from database从数据库中删除后刷新 ListView
【发布时间】:2012-12-13 11:39:59
【问题描述】:

我有一个带有 SimpleCursorAdapter 的 ListView,它从数据库加载信息,我希望 onlongclicklistener 从数据库中删除一个项目,它工作正常,但列表不刷新,我尝试使用 listView.refreshDrawableState();以及我找到的一些其他方法作为答案,但没有一个有效,这是我的 onCreate 函数:

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_act);
    imzero = (ImageView)findViewById (R.id.iv_zero_pers);
    tvzero = (TextView)findViewById (R.id.tv_zero_pers);
    dbConnector = new DatabaseConnectorrso(MyListActivity.this);
    dbConnector.checkCursor();
    if (DatabaseConnector.de)//check if database is emplty
    {
    try{                
        dbConnector.open();             
        dbConnector.load();//load information from database
        dbConnector.close();
        imzero.setVisibility(View.GONE);
        tvzero.setVisibility(View.GONE);
    }
    catch(Exception ex) {
        ex.printStackTrace();
        dbConnector.close();
    }
    conAdapter =(new ImageAndTextAdapter(MyListActivity.this,
            R.layout.meniu_lista_element, null, null, null));
    setListAdapter(conAdapter);
    }
    else{
        dbConnector.close();
        imzero.setVisibility(View.VISIBLE);
        tvzero.setVisibility(View.VISIBLE);
    }

我尝试像这样刷新列表

   listView.setOnItemLongClickListener(new OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            deleteDialog(Integer.parseInt (DatabaseConnector.id.get(position))); //delete from database 
            dbConnector.checkCursor();
            if (DatabaseConnector.de)
            {
            try{                
                dbConnector.open();             
                dbConnector.loadPersoane();
                listView.refreshDrawableState();
                dbConnector.close();
                imzero.setVisibility(View.GONE);
                tvzero.setVisibility(View.GONE);
            }
            catch(Exception ex) {
                ex.printStackTrace();
                dbConnector.close();
            }
            conAdapter =(new ImageAndTextAdapter(AltePersoane.this,
                    R.layout.meniu_lista_element, null, null, null));
            setListAdapter(conAdapter);
            }
            else{
                dbConnector.close();
                imzero.setVisibility(View.VISIBLE);
                tvzero.setVisibility(View.VISIBLE);
            }

            return true;
        }
    }); 

【问题讨论】:

  • 重新查询数据库,获取新游标,然后通知列表视图上的数据集发生变化

标签: android database listview


【解决方案1】:

试试

yourAdapter.notifyDataSetChanged();

yourAdapter.getCursor().requery();

更新

我认为你做错了什么,试试这个:

listView.setOnItemLongClickListener(new OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        deleteDialog(Integer.parseInt (DatabaseConnector.id.get(position))); //delete from database 
        dbConnector.checkCursor();
        if (DatabaseConnector.de)
        {
        try{                
            dbConnector.open();             
            dbConnector.loadPersoane();
                                //Removed
            dbConnector.close();
            imzero.setVisibility(View.GONE);
            tvzero.setVisibility(View.GONE);
        }
        catch(Exception ex) {
            ex.printStackTrace();
            dbConnector.close();
        }
        conAdapter.notifyDataSetChanged();
        }
        else{
            dbConnector.close();
            imzero.setVisibility(View.VISIBLE);
            tvzero.setVisibility(View.VISIBLE);
        }

        return true;
    }
}); 

【讨论】:

  • 我必须在 setListAdapter 之前写下这一行?
  • 您不必再次设置适配器。删除这些行。
  • 仍然无法使用 Adapter.notifyDataSetChanged();什么都没有发生,并且 yourAdapter.getCursor().requery();应用停止
  • 我解决了,我把这个活动的意图变成了同一个活动,没关系
  • 这将重新创建您的整个活动,您的应用程序的性能将受到影响...
【解决方案2】:

尝试将您的活动中的活动意图相同,它可以工作

    Intent i = new Intent (MyActivity.this,MyActivity.class);
    startActivity (i);

【讨论】:

  • 它一次又一次地调用你的活动......如果我这样做很多次呢?请不要推荐这种类型的东西。
  • 是的,有很多方法可以在没有呼叫意图的情况下执行此操作。删除后调用 onCreate();方法它会无意识地做同样的事情。第二种方法如下检查ThePCWizard的答案。光标会自动做同样的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多