2014-11-14 1 views
2

Я в своеобразном приложении в своем приложении.Как сделать фрагмент обновить и загрузить заново нажатой андроид

Когда я загружаю первые загрузки, есть custom listview, который заполнен данными с сервера. Я также использую класс, который содержит разные поля для строковых данных с сервера.

Когда я нажимаю элемент на custom listview, объект соответствующего класса передается на следующий фрагмент.

То, что текущий fragment заменяется на new fragment, и объект передается с bundle.

В настоящее время new listview загружается с различными задачами. Нажав на задание, загружается new fragment с камерой.

После получения изображения и загрузки на сервер статус в JSON изменяется на «ЗАВЕРШЕНО». Но теперь, когда я нажимаю назад, отображается старое listview.

Есть ли способ заполнить listview на задней панели с новыми данными?

Проблема в том, что я передаю объект прямо из первого фрагмента.

Теперь мне нужен новый объект на спине нажатой, как передать новый объект на спину нажатой?

+0

http://developer.android.com/training/basics/fragments/ communicationating.html –

+0

Итак, после того, как фрагмент 2 сделан, вам нужен фрагмент 1 t requery для webservice? Или вам нужен фрагмент 2 для передачи данных обратно в фрагмент 1, а для Frag 1 - отображение обновленных данных в списке? – NameSpace

+0

@NameSpace Я разработал решение ur. Но теперь есть новая проблема, когда я нажимаю назад, и я хочу поместить статус «DONE» в элемент списка. Он отображается по двум пунктам в списке. Пожалуйста, помогите с этот вопрос: http: //stackoverflow.com/questions/26945004/customlistview-showing-status-twice-in-the-listview –

ответ

0

Когда Фрагмент 2 получает данные, он должен пройти его в какой-то момент до того, как проснется Фрагмент 1.

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

Я просто советую просто кэшировать данные о деятельности, пока вы не узнаете больше о разных методах.

// Фрагмент 2 помещает данные в деятельности

((MyActivity) getActivity).mListViewData = listViewData; 

Тогда следующая часть вопроса, как это фрагмент 1 получить данные. Фрагмент 1 спящий с задней стороны. Когда он просыпается, он вызовет метод onViewCreated() (потому что предыдущее представление было уничтожено до того, как оно будет помещено в backstack).

В этом методе мы проверяем, есть ли новые данные в ожидании фрагмента 1.

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 

MyDataType listViewData = ((MyActivity) getActivity).mListViewData; 

if(listViewData != null){ 

    //setData is your own function for replacing the adapters 
    //data backing 

    listView.getAdapter().setData(listViewData); 
}else{ 
    listView.getAdapter().setData(...defaultData); 
} 

listView.getAdapter.notifyDataChanged(); 

} 
+0

. Моя проблема в том, что данные являются ответом JSON. И я получаю конкретный объект из класс, в который я поместил все данные. Например, у класса есть поля, такие как имя, id, task_id ... и т. д. Я создал arraylist типа класса и передал объект SPECIFIC путем связывания в мой последний фрагмент. Но когда я делаю что-то в последнем фрагменте, данные этого конкретного объекта меняются в JSON. Теперь, когда я нажимаю назад, отображаются более старые данные (для этого конкретного объекта). Вопрос в том, как получить доступ к обновленным данным для этого конкретного объекта? –

+0

В комплект входит только сериализованные данные, поэтому, когда вы его получите во Фрагменте 2, у вас есть клон исходных объектов данных. То, что происходит с этими данными, не изменяет данные, содержащиеся в фрагменте 1. Что вам нужно сделать, это передать ссылку на Фрагмент 1 этого нового сбора данных. Вы можете передать его активности, как я уже упоминал, а фрагмент 1 может получить новую ссылку, когда он вызывает метод onViewCreated(). Затем вам придется заменить старую ссылку, в которой хранятся данные фрагмента 1, с новой. – NameSpace

+0

Как я могу получить новый обновленный объект данных из webservice? Как снова вызвать веб-сервис? Вы говорите, что мне нужно передать новую ссылку на фрагмент 1. Но я могу получить новую ссылку только через webservice. –

0

переопределять значение onBackPressed в деятельности, которая управляет Fragments. В нем вы можете проверить, является ли фрагмент видимым или нет (тот, из которого должно выполняться действие, если нажата кнопка назад), а затем выполните действие.

@Override 
public void onBackPressed(){ 
    Fragment myFragment = getFragmentManager().findFragmentByTag("MY_FRAGMENT"); 
    if (myFragment.isVisible()) { 
     String json = myFragment.getJsonData(); //update it locally 
     if(isUpdated){ 
      Fragment listFragment = getFragmentManager().findFragmentByTag("MY_LIST_FRAGMENT"); 
      listFragment.updateListView(json); //Add this method on your fragment 
     } 
    } 
    super.onBackPressed(); 
} 

Obs .: Для того, чтобы использовать .findFragmentByTag() вы должны добавить теги, как только вы делаете сделку так:

fragTrans.replace(android.R.id.content, myFragment, "MY_FRAGMENT"); 

Если по какой-либо причине listFragment был очищен из памяти , вам все равно придется перезагружать данные, чтобы снова загружать новые данные.

Чтобы обновить ListView, см.: How to refresh Android listview?. Обратите внимание, что вам нужно будет отправить новый набор данных в представление списка (что вы можете сделать внутри метода updateListView())

+0

Я считаю, что его фрагмент находится в задней части экрана, и я выхожу из его утверждения о том, что нажатие на него возвращает его на фрагмент 1. Хотя на backstack у frag1 нет listView b/c, его представление было уничтожено, поэтому вы должны провести обновление списка поскольку после воссоздания вида. – NameSpace

+0

Ну, по моему опыту, вид не убит в течение довольно долгого времени, но я не мог найти информацию об этом, если он это сделает, если он действительно убит, то, безусловно, все остальные переменные и он будет иметь чтобы перезагрузить данные в любом случае (будет обновлено) – holandaGo

+0

Проблема заключается в том, что я должен снова вызвать веб-сервис для получения обновленных данных. Как я это делаю. Вы скажете listFragment.updateListView(), но снова вызываете веб-сервис для определенного объекта, это возможно? –

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