2013-03-15 1 views
0

ListFragment를 작성 중입니다. 세로로 보면 두 개의 헤더가 필요하지만 가로로 보면이 헤더가 왼쪽에 ListView가 오른쪽에 있어야합니다. xml은 다른 레이아웃을 처리하고 java는 적절하게 채우기/업데이트를 처리합니다.오리엔테이션 변경 후 헤더가 ListFragment에 남아 있지 않음

오리 엔테이션 변경시를 제외하고 모두 광고 된대로 작동합니다. 헤더는 목록과 함께 유지되지 않습니다. listView는 스크롤을 유지하지만 머리글을 제거하여 이동합니다.

조각을 중첩하는 것이 더 좋을 수 있지만 목록 뷰는 framelayout을 보유하지 않으므로 논점이됩니다.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 

    loadFeeds(); 
} 

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

    return v; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    setupList(savedInstanceState); 
    setupOrienation(); 

    super.onActivityCreated(savedInstanceState); 
} 

private void setupList(Bundle savedInstanceState) { 
    if(getListAdapter() == null) { 
     listProfileButtons = (View)getLayoutInflater(savedInstanceState).inflate(R.layout.view_profile_buttons, null); 
     listProfile = (View)getLayoutInflater(savedInstanceState).inflate(R.layout.view_profile_header, null); 

     getListView().addHeaderView(listProfile); 
     getListView().addHeaderView(listProfileButtons); 
    } 
} 

private void setupOrienation(){ 
    if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     listProfile.setVisibility(View.GONE); 
     listProfileButtons.setVisibility(View.GONE); 
     setupProfile(getView()); 
     setupButtons(getView()); 
     getListView().setOnScrollListener(new OnScrollListener() { 

      @Override 
      public void onScrollStateChanged(AbsListView view, int scrollState) { 
      } 

      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
      } 
     }); 
    } else { 
     listProfile.setVisibility(View.VISIBLE); 
     listProfileButtons.setVisibility(View.VISIBLE); 
     //setupProfile(getListView()); 
     //setupButtons(getListView()); 
     setupButtons(getView().findViewById(R.id.include_profile_buttons)); 

     getListView().setOnScrollListener(new OnScrollListener() { 

      @Override 
      public void onScrollStateChanged(AbsListView view, int scrollState) { 
      } 

      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
       if(firstVisibleItem > 0) { 
        getView().findViewById(R.id.include_profile_buttons).setVisibility(View.VISIBLE); 
       } else { 
        getView().findViewById(R.id.include_profile_buttons).setVisibility(View.GONE); 
       } 

      } 
     }); 

    } 
} 

private void setupProfile(View parent) { 
    Bundle userBundle = getArguments(); 

    TextView name = (TextView)parent.findViewById(R.id.text_view_profile_name); 
    TextView screenName = (TextView)parent.findViewById(R.id.text_view_profile_at_user); 
    ImageView image = (ImageView)parent.findViewById(R.id.image_view_profile_picture); 

    name.setText(userBundle.getString(User.USER_NAME)); 
    screenName.setText("@" + userBundle.get(User.SCREEN_NAME)); 
    ImageCacheManager.getInstance(getActivity()).bindDrawable(userBundle.getString(User.PROFILE_IMAGE), image); 

} 

private void setupButtons(View v) { 
    Bundle userBundle = getArguments(); 

    Button buttonTweets = (Button)v.findViewById(R.id.button_number); 
    Button buttonFollowing = (Button)v.findViewById(R.id.button_follow); 
    Button buttonFollowers = (Button)v.findViewById(R.id.button_friends); 

    buttonTweets.setText(getResources().getString(R.string.profile_number, userBundle.getInt(User.NUMBER))); 
    buttonFollowing.setText(getResources().getString(R.string.profile_number_follow, userBundle.getInt(User.NUMBER_OF_FOLLOW))); 
    buttonFollowers.setText(getResources().getString(R.string.profile_number_friends, userBundle.getInt(User.NUMBER_OF_FRIENDS))); 

    buttonTweets.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      switchListAdapter(adapter); 
     } 
    }); 

    buttonFollowing.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      switchListAdapter(followAdapter); 
     } 
    }); 

    buttonFollowers.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      switchListAdapter(friendsAdapter); 
     } 
    }); 
} 

헤더가 손실 된 후 null 포인터 예외를 중지하도록 주석 처리 된 코드가 수행됩니다.

답변

2

따라서 회전시 모든보기가 파괴됩니다. 즉 헤더를 의미합니다. 나는 당신이 setRatainInstance (true) 때 ListFragment 헤더의 헤더를 처리해야한다고 생각하지만 그렇게하지는 않는다.

@Override 
public void onDestroyView() { 
    setListAdapter(null); 
    super.onDestroyView(); 
} 

그런 다음 나는 단지 좋은 내가 그들을 필요로하는 방향에서 헤더를 추가 : 당신이 retainInstance에 사용하는 ListFragment와 헤더를 사용합니다. 그것에 관한 부정적인 부분은 scroll isn't retained이고 어느 어댑터가 있어야하는지 알아야합니다. 그것들은 너무 나쁘지는 않은 몇 가지 방법입니다.