Я хочу изменить состояние приложения, а затем перезагрузить действие, чтобы отразить изменение

Привет, я изменяю состояние приложения, а затем хочу перезагрузить действие, чтобы отразить изменение, которое я пытаюсь использовать notifyDataSetChanged, но оно не работает... в основном, когда я выбираю опцию "удалить", операция удаления работает, но она не обновляется. адаптер курсора ContextMenu для ListActivity:

    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);
}

Мой initLIst():

    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);         

}

DeleteItemList:

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);

}

Класс RestauranteAdapter:

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);
    }
  }

У меня есть другая тема, но все, что я пытался сделать, там не работает... IDK, что делать, операции удаления работают, но не обновлять адаптер курсора

После того, как я исправлю код, 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);
}

Спасибо за все!!

3 ответа

Решение
  1. Вам не нужен DeleteItemList деятельность. Деятельность - это отдельная, сфокусированная вещь, которую может сделать пользователь (то есть экран пользовательского интерфейса). Создание Activity для простого удаления совершенно бессмысленно. Вы должны выполнить удаление как есть (в рамках текущей операции) вместо создания (и завершения) нового Activity выполнить задачу.

  2. Быстрое решение состоит в том, чтобы позвонить reQuery на вашем курсоре. До версии API 11, как бы вы обновили свой Cursorсодержание было по телефону requery() на нем (например, после выполнения удаления). Обратите внимание, однако, что это устарело в пользу того, чтобы ваш Activity реализовать LoaderManager.LoaderCallbacks<Cursor> интерфейс. startManagingCursor() а также stopManagingCursor() также устарели.

  3. Правильное решение состоит в том, чтобы начать все сначала и Activity реализовать LoaderManager.LoaderCallbacks<Cursor> интерфейс. Почти смешно, насколько проще был бы ваш код, если бы вы сделали это, поскольку все, что вы упомянули в своем посте, выполняется автоматически LoaderManager, LoaderManager регистрирует ContentObserver который обнаружит, когда ваши данные будут изменены. Он также автоматически выполняет запросы в фоновом потоке, что является предпочтительным, поскольку гарантирует, что дорогие запросы не будут блокировать поток пользовательского интерфейса.

    That being said, this will require a lot of work on your part, so I wouldn't blame you if you just stuck with the quick fix and ignored #3:). Here's a helpful tutorial if you are interested though.

Вы можете просто повторно запросить после удаления, а затем установить этот курсор с помощью адаптера, возможно, есть лучший способ, но этот способ работает, и его можно быстро исправить.

Я думаю, что проблема происходит внутри 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);
}

и тогда вы сможете перехватить возврат из DeleteItemList с помощью onActivityResult():

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
    }
}
Другие вопросы по тегам