2015-03-07 2 views
0

Я работаю над фрагментом, когда я нажимаю кнопку, он переключится на другое действие после того, как операция сохранит данные в базе данных, она вернется обратно к фрагмент, однако фрагмент не может отображать новейшие данные, мне нужно перейти к активности фрагмента, а затем снова вернуться к фрагменту, он покажет новейшие данные.Невозможно обновить фрагмент после расчесывания назад из другой активности

Вот мой код фрагмента. Я думал, что, поскольку я поместил setAdapter в метод onActivityCreated(), я попытался поместить его в onCreate() и onCreateView(), оба возвращают ошибку nullpointer.

public class TodoFragment extends ListFragment { 

private TodoDataSource datasource; 
private Todo item; 
List<Todo> todoList; 
MyCustomAdapter adapt; 
ListView listTask; 
EditText t; 

public TodoFragment(){ 
} 

/*@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    //setHasOptionsMenu(true); 

    datasource = new TodoDataSource(getActivity()); 
    datasource.open(); 

    todoList = datasource.getAllTodos(); 
    adapt= new MyCustomAdapter(getActivity(), R.layout.todo_list, todoList); 
    //ListView listTask =(ListView) rootView.findViewById(android.R.id.list); 
    listTask.setAdapter(adapt); 
}*/ 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState);   
    // if (activity != null) { 
     // Create an instance of the custom adapter for the GridView. A static array of location data 
     // is stored in the Application sub-class for this app. This data would normally come 
     // from a database or a web service. 
     datasource = new TodoDataSource(getActivity()); 
     datasource.open(); 

     todoList = datasource.getAllTodos(); 
     adapt= new MyCustomAdapter(getActivity(), R.layout.todo_list, todoList); 
     //ListView listTask =(ListView) rootView.findViewById(android.R.id.list); 
     listTask.setAdapter(adapt); 

     Button button = (Button) getActivity().findViewById(R.id.simpleadd); 
     button.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //String summary = t.getText().toString();     
      Intent i = new Intent(getActivity(), TodoDetailActivity.class); 

      //Bundle bundle = new Bundle(); 
      // bundle.putString("Summary", summary); 
      //i.putExtras(bundle); 
      startActivity(i); 
     } 
    }); 

} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.main, menu); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_todo, container, false); 

    t = (EditText) rootView.findViewById(R.id.simple); 
    listTask = (ListView) rootView.findViewById(android.R.id.list); 

    return rootView; 
} 

@Override 
public void onResume() { 
    datasource.open(); 
    super.onResume(); 
    adapt.notifyDataSetChanged(); 
} 

@Override 
public void onPause() { 
    datasource.close(); 
    super.onPause(); 
} 

}

Вот часть моего другого кода вида деятельности. он обновит базу данных и вернется к фрагменту.

confirmButton.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View view) { 
    if (TextUtils.isEmpty(mTitleText.getText().toString())) { 
     makeToast(); 
    } else { 
     final String category = mCategory.getSelectedItem().toString(); 
     final String summary = mTitleText.getText().toString(); 
     final String description = mBodyText.getText().toString(); 
     datasource.createTodo(category, summary, description); 
     setResult(RESULT_OK); 
     finish(); 
    } 
    } 

}); 

ответ

0

Похоже, что вы не обновляя свой источник todoList данных перед вызовом notifyDataSetChanged() в onResume().

Изменить: сначала очистить список, а затем повторно заполнить. Кроме того, добавить протоколирование, чтобы помочь отследить проблему:

@Override 
public void onResume() { 
    super.onResume(); 
    datasource.open(); 
    todoList.clear(); 
    todoList.addAll(datasource.getAllTodos()); 
    adapt.notifyDataSetChanged(); 

    Log.d("MyApp", "Size of data: " + todoList.size()); 
} 

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

+0

Я пробовал, но ничего не изменилось ... может быть, мне нужно переместить что-то из onActivityCreated() в onCreate()? – Aprilyn

+0

Нет, не изменяйте это, если представление создается при первом отображении. Я думаю, что необходимо провести дополнительное расследование, попробуйте выяснить, вызван ли вызов onResume(), я обновлю свой ответ, чтобы попытаться помочь вам. Также взгляните на это сообщение: http://stackoverflow.com/questions/16219732/refreshing-arrayadapter-onresume-notifydatasetchanged-not-working/16219931#16219931 –

+0

Я попробую и найду больше ссылок, спасибо человеку! – Aprilyn

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