2012-06-27 3 views
0

У меня есть два почти идентичные 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 в фрагменте . Просто я не могу вернуться назад, чтобы просмотреть предыдущий список.

ответ

0

Забудьте фрагмент B. Переверните заднее нажатие, поместите if туда, чтобы определить, активен ли Список B, если он есть, измените его, иначе выполните обычную функцию возврата.

public void onBackPressed() { 
    // Code here to change list or go back. 
    return; 
} 
+0

Есть ли способ сделать что-то вроде «addToBackStack» или сохранить состояние списка A? Поскольку я не хочу использовать AsyncTasker для загрузки данных во фрагмент A каждый раз, когда я нажимаю «назад» в списке B. Я задал этот вопрос до [здесь] (http://stackoverflow.com/questions/11210872/getting- back-previous-data-from-listfragment-when-press-back-button) – ytz

+0

Я не играл с ним много (и у меня нет ничего близкого к эксперименту), но я считаю, что вы можете просто изменить адаптер, поддерживающий list (укажите список для нового адаптера), вызовите 'notifyDatasetChanged', чтобы принудительно выполнить перерисовку списка и продолжить. Это оставило бы предыдущий адаптер в игре (но не подключен ни к чему). Затем просто измените их. – Barak

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