У меня есть два почти идентичные ListFragment & B, за исключением того, что они черпают данные из их соответствующих Asynctasker.Замена ListFragment с другим ListFragment
onListItemClick на приведет к Фрагмент заменяется B. Однако мое приложение всегда застревает у конструктора своего CustomAdapter в B.
private class CustomAdapter_B extends ArrayAdapter<MatchType> {
// Stuck Here
CustomAdapter_B() {
super(getActivity(), R.layout.color_match_type_s2, matches_type_s2);
}
фрагмента А
public class Fragment A extends ListFragment implements AsyncTaskCompleteListener<ArrayList<MatchType>>{
ArrayList<MatchType> matches_type = new ArrayList<MatchType>();
private ProgressDialog dialog;
private static FirstPageFragmentListener main_caller;
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
//Interface, triggering Fragment Replace in my Fragment Adapter
main_caller.onMySignalWithNum(1, (matches_type.get(position).getLink()));
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
this.dialog.show();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// AsyncTasker to draw data for ArrayAdapter
LoadMatchType lmt = new LoadMatchType(this);
lmt.execute();
}
@Override
public void onTaskComplete(ArrayList<MatchType> result) {
dialog.dismiss();
//result.remove(result.size()-1);
matches_type = result;
setListAdapter(new CustomAdapter());
}
}
//Custom Adapter
private class CustomAdapter extends ArrayAdapter<MatchType> {
CustomAdapter() {
super(getActivity(), R.layout.color_match_type, matches_type);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View row = convertView;
if (row == null) {
LayoutInflater inflater = getActivity().getLayoutInflater();
row = inflater.inflate(R.layout.color_match_type, parent, false);
}
TextView tv_type = (TextView) row.findViewById(R.id.textView_type);
tv_type.setText(matches_type.get(position).getType());
TextView tv_tweet = (TextView) row.findViewById(R.id.textView_tweet);
tv_tweet.setText(matches_type.get(position).getTweet());
TextView tv_tph = (TextView) row.findViewById(R.id.textView_tph);
tv_tph.setText(matches_type.get(position).getTph());
return row;
}
}
public static Fragment newInstance(
FirstPageFragmentListener pageFragmentListener) {
// TODO Auto-generated method stub
footOddsFragment frag = new footOddsFragment();
main_caller = pageFragmentListener;
return frag;
}
}
//INTERFACE
interface AsyncTaskCompleteListener<T> {
public void onTaskComplete(ArrayList<MatchType> result);
}
Фрагмент В примерно одинакова.
Приложение застрянет в конструкторе CustomAdapter Fragment B, и экран будет пустым.
О, и все работает отлично, если я отказаться от Fragment B и просто вызовите Asynctasker_B в onListItemClick в фрагменте . Просто я не могу вернуться назад, чтобы просмотреть предыдущий список.
Есть ли способ сделать что-то вроде «addToBackStack» или сохранить состояние списка A? Поскольку я не хочу использовать AsyncTasker для загрузки данных во фрагмент A каждый раз, когда я нажимаю «назад» в списке B. Я задал этот вопрос до [здесь] (http://stackoverflow.com/questions/11210872/getting- back-previous-data-from-listfragment-when-press-back-button) – ytz
Я не играл с ним много (и у меня нет ничего близкого к эксперименту), но я считаю, что вы можете просто изменить адаптер, поддерживающий list (укажите список для нового адаптера), вызовите 'notifyDatasetChanged', чтобы принудительно выполнить перерисовку списка и продолжить. Это оставило бы предыдущий адаптер в игре (но не подключен ни к чему). Затем просто измените их. – Barak