2013-02-28 3 views
0

здесь мой код в моем ListFragment (я использую контекстное меню):ListFragment не обновит

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item 
      .getMenuInfo(); 
    Log.d(TAG, "onContextItemSelected clicked"); 
    long id = info.id; 
    Log.d(TAG, "list id " + id); 

    int menuItemIndex = item.getItemId(); 
    Log.d(TAG, "menuItemIndex " + menuItemIndex); 
    if (menuItemIndex == 0) { 
     try { 
      plantManager.deletePlantRelation(id); 
      CharSequence text = getActivity().getString(
        R.string.info_could_delete_plant); 
      Toast toast = Toast.makeText(getActivity(), text, 
        Toast.LENGTH_LONG); 
      toast.show(); 
      loader = getLoaderManager().restartLoader(0, null, this); 
      myAdapter.notifyDataSetChanged(); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
      CharSequence text = getActivity().getString(
        R.string.info_could_not_delete_plant); 
      Toast toast = Toast.makeText(getActivity(), text, 
        Toast.LENGTH_LONG); 
      toast.show(); 
     } 
    } 
    return true; 
} 

Метод выполняется, и я получаю Toast-сообщение - но список не будет обновляться ,

С нетерпением жду вашей помощи.

Заранее благодарен!

обновление:

public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { 

     return new CursorLoader(getActivity()) { 
      @Override 
      public Cursor loadInBackground() { 
       myCursor = plantManager.fetchPlantRelations(); 
       return myCursor; 
      } 
     }; 
    } 
+0

Думаю, нам нужно будет увидеть код для onCreateLoader. Если deletePlantRelation фактически удаляет элемент из базового набора данных, вам не нужно будет перезапускать загрузчик * и * notifyDataSetChanged ... –

+0

да набор данных удален из базы данных - я проверил его – user1800825

+0

ну, это не огромная помощь : что делает fetchPlantRelations? Дело здесь в том, что ничто из этого не должно быть необходимым. См. Ответ ниже. –

ответ

0

Не только вы должны не нужно делать как сброс на LoaderManager и notifyDataSetChanged на адаптере, вы действительно не должны делать либо. Правильный способ сделать это - убедиться, что курсор, возвращаемый fetchPlantRelations(), был зарегистрирован для уведомлений о конкретном URI. Если вы сделаете так, чтобы изменения в базовом наборе данных (например, вызывающие deletePlantRelation) уведомили об этом URI, остальное произойдет полностью автоматически. Проверьте код здесь:

https://github.com/marakana/yamba/blob/yambaII/YambaService/src/com/marakana/android/yamba/svc/data/YambaProvider.java

Посмотрите, особенно, в строках 182 и 242. Это все, что есть в ней.

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