【问题标题】:Can't refresh the fragment after combing back from another activity从另一个活动中梳理回来后无法刷新片段
【发布时间】:2015-03-07 03:36:11
【问题描述】:

我正在处理fragment,当我点击一个按钮时,它会转到另一个activity,activity将数据保存到数据库后,它会返回到fragment,但是,fragment不能显示最新的数据,我需要去fragment的activity,然后再回到fragment,它会显示最新的数据。

这是我的片段代码。我以为是因为我把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();
    }
  }

});

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    onResume() 中调用notifyDataSetChanged() 之前,您似乎没有更新数据源todoList

    编辑:先清除列表,然后重新填充。还添加日志记录以帮助追踪问题:

    @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 课程,我可以给您一些示例代码。

    【讨论】:

    • 我试过了,但没有任何改变......也许我应该把一些东西从 onActivityCreated() 移到 onCreate()?
    • 不,如果视图在第一次显示时成功创建,请不要更改。我认为需要进一步调查,尝试查看是否调用了 onResume(),我会更新我的答案以帮助您。也看看这个帖子:stackoverflow.com/questions/16219732/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多