0

嗨,我更改了应用程序状态,然后我想重新加载活动以反映我尝试使用 notifyDataSetChanged 的​​更改,但它也不工作......基本上当我选择“删除”选项时,删除操作有效,但它不刷新ListActivity 上的光标适配器 ContextMenu:

    public boolean onContextItemSelected(MenuItem item)
{
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    int index = info.position;
    View view = info.targetView;
    long id = info.id;

    if(item.getItemId()==R.id.edit){
        Intent i=new Intent(ProjetoProTelefoneActivity.this, DetailForm.class);
        i.putExtra(ID_EXTRA, String.valueOf(id));
        startActivity(i);
        return(true);
    }
    else if(item.getItemId()==R.id.remove){

        Intent i=new Intent(ProjetoProTelefoneActivity.this, DeleteItemList.class);
        i.putExtra(ID_EXTRA, String.valueOf(id));
        startActivity(i);
        ListView listView = getListView();
        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        return(true);
    }

    return super.onContextItemSelected(item);
}

我的初始化列表():

    private void initList(){
    if(modelo!=null){
        stopManagingCursor(modelo);
        modelo.close();
    }

    modelo =helper.getAll(prefs.getString("sort_order","nome DESC"));
    startManagingCursor(modelo);        

    adapter = new RestaurantAdapter(modelo);       
    setListAdapter(adapter);         

}

删除项目列表:

public class DeleteItemList extends Activity{
RestauranteHelper helper = null;
String restauranteId= null;


public void onCreate(Bundle savedInstaceState){
    super.onCreate(savedInstaceState);
    helper= new RestauranteHelper(this);


    restauranteId=getIntent().getStringExtra(ProjetoProTelefoneActivity.ID_EXTRA);
    helper.delete(restauranteId);
    finish();
}

public void onDestroy(){
    super.onDestroy();
    helper.close();

}
}

我的 RestauranteHelper.delete:

    public void delete(String id){
    String[] args = {id};

    getWritableDatabase().delete("restaurantes", "_ID =?", args);

}

类餐厅适配器:

class RestaurantAdapter extends CursorAdapter {
    RestaurantAdapter(Cursor c) {
      super(ProjetoProTelefoneActivity.this, c);
    }

    public void bindView(View row, Context ctxt,
                         Cursor c) {
      RestaurantHolder holder=(RestaurantHolder)row.getTag();

      holder.populateFrom(c, helper);
    }


    public View newView(Context ctxt, Cursor c,
                         ViewGroup parent) {
      LayoutInflater inflater=getLayoutInflater();
      View row=inflater.inflate(R.layout.row, parent, false);
      RestaurantHolder holder=new RestaurantHolder(row);

      row.setTag(holder);

      return(row);
    }
  }

我有其他主题,但我在那里尝试做的所有事情都没有工作......我知道该怎么做,删除操作有效,但不要刷新光标适配器

在我更正代码后,onContextItemSelected 看起来像,并且我不再使用 DeleteItemList,如您所见:

    public boolean onContextItemSelected(MenuItem item)
{
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    int index = info.position;
    View view = info.targetView;
    long id = info.id;

    if(item.getItemId()==R.id.edit){
        Intent i=new Intent(ProjetoProTelefoneActivity.this, DetailForm.class);
        i.putExtra(ID_EXTRA, String.valueOf(id));
        startActivity(i);
        return(true);
    }
    else if(item.getItemId()==R.id.remove){
        restauranteId=String.valueOf(id);
        //Toast.makeText(this,  String.valueOf(id),  Toast.LENGTH_LONG).show();
        helper.delete(restauranteId);
        initList();
        return(true);
    }
    return super.onContextItemSelected(item);
}

谢谢大家!!

4

3 回答 3

0

我认为问题发生在onContextItemSelected()代码内部:

else if(item.getItemId()==R.id.remove){
    Intent i=new Intent(ProjetoProTelefoneActivity.this, DeleteItemList.class);
    i.putExtra(ID_EXTRA, String.valueOf(id));
    startActivity(i);

    // The following is executed before the DeleteItemList does 
    // its deletion work!

    ListView listView = getListView();
    listView.setAdapter(adapter);
    adapter.notifyDataSetChanged();

    return(true);
}

因此,只需为结果开始活动:

else if(item.getItemId()==R.id.remove){
    Intent i=new Intent(ProjetoProTelefoneActivity.this, DeleteItemList.class);
    i.putExtra(ID_EXTRA, String.valueOf(id));
    startActivityForResult(i, YOUR_REQUEST_CODE); // check the documentation
    return(true);
}

然后您将能够使用 onActivityResult() 从 DeleteItemList 中获取返回:

protected void onActivityResult (int requestCode, int resultCode, Intent data) {
    if (YOUR_REQUEST_CODE == requestCode) {
        // you are back from DeleteItemList, so refresh the list content
        ((CursorAdapter) getListAdapter()).notifyDataSetChanged(); // or smth like that
    }
}
于 2012-06-06T20:39:06.643 回答
0

您可以在删除后重新查询,然后使用适配器设置该光标,可能有更好的方法,但这种方法有效并且可以快速修复

于 2012-06-06T20:39:34.003 回答
0
  1. 你不需要DeleteItemList活动。活动是用户可以做的一个单一的、专注的事情(即一个 UI 屏幕)。为简单的删除创建一个Activity完全没有意义。您应该按原样(在当前活动中)执行删除,而不是创建(并完成)一个全新Activity的任务来执行任务。

  2. 快速解决方法是调用reQuery光标。在 API 版本 11 之前,刷新Cursors 内容的方式是调用requery()它(例如,在执行删除之后)。但是请注意,不赞成这样做,有利于让您Activity实现LoaderManager.LoaderCallbacks<Cursor>接口。startManagingCursor()并且stopManagingCursor()也被弃用了。

  3. 正确的解决方法是重新开始并让您Activity实现LoaderManager.LoaderCallbacks<Cursor>接口。如果您这样做,您的代码会变得多么简单,这几乎是荒谬的,因为您在帖子中提到的所有内容都是由LoaderManager. LoaderManager寄存器 a将ContentObserver检测您的数据何时更改。它还自动在后台线程上执行查询,这是首选,因为它将确保昂贵的查询不会阻塞 UI 线程。

    话虽如此,这需要您做很多工作,所以如果您只是坚持快速修复并忽略#3 :),我不会责怪您。如果您有兴趣,这里有一个有用的教程。

于 2012-06-06T20:53:11.483 回答