0

HI я изменяю состояние приложения, а затем я хочу перезагрузить активность, чтобы отразить изменение, пытающееся использовать notifyDataSetChanged, но не работающее ... в основном, когда я выбираю опцию "удалить", операция удалить работает, но Dont обновить курсор адаптер 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); 
    } 
    } 

у меня есть другая тема, но все я судимое сделать там не работало ... ИДК, что делать, операции удаления, butdont обновить адаптер курсора

После того как я исправлю код onContextItem Выбранный выглядит, и им больше не пользоваться 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); 
} 

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

ответ

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

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

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

    Это, как говорится, потребует много работы с вашей стороны, поэтому я бы не стал обвинять вас, если вы просто застряли с быстрым исправлением и проигнорировали # 3 :). Вот вам полезный tutorial, если вы заинтересованы.

+0

его трудно понять, что я здесь, я изучаю приложение андроидов своим я в течение 3 дней, поэтому я проверю этот учебник и посмотреть, что произойдет, спасибо –

+0

Лучший совет, который я могу вам дать, - это придерживаться его, и оставьте его, если его слишком много, чтобы принять его прямо сейчас. Я помню, когда я впервые начал много вещей, потому что вы не одиноки. Но теперь я оглядываюсь на многие из этих вещей, и все это соединяется вместе. Поэтому придерживайтесь этого! :) –

+0

ну спасибо за помощь, я решил не использовать deleteItemList, как и предлагаю, и я изменил код, как вы можете видеть на моем edit = D –

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

, и тогда вы будете в состоянии поймать возвращение назад от 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 
    } 
} 
+0

Кстати, глядя на то, что 'DeleteItemList', я должен сказать, что он вам не нужен, потому что вы можете сделать то же удаление внутри основного действия. –

+0

что вы имеете в виду с YOUR_REQUEST_CODE, я понимаю, что это за изменения, но idk, что я должен вставить в YOUR_REQUEST_CODE ... »/ –

+0

Пожалуйста, проверьте документацию для' Activity.startActivityForResult (Intent intent, int requestCode) '. –

0

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

Смежные вопросы