0

ListFragmentを作成しています。縦向きでは2つのヘッダーが必要ですが、横向きでは左側にこれらのヘッダーが必要で、右側にListViewがあります。xmlはさまざまなレイアウトを処理し、javaはそれらを適切に埋める/更新することを処理します。

向きを変更するとヘッダーがリストに保持されないことを除いて、すべてがアドバタイズされたとおりに機能します。listViewはスクロールを保持しますが、ヘッダーの削除によってシフトされます。

フラグメントをネストする方が良いかもしれませんが、リストビューはフレームレイアウトを保持しないため、これは重要なポイントです。

@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ポインター例外を停止するために行われます。

4

1 に答える 1

2

そのため、回転するとすべてのビューが破棄されます。つまり、ヘッダーが破棄されます。RatainInstance(true) を設定すると、 ListFragment ヘッダーのヘッダーを処理する必要がありますが、処理しないと思います。保持インスタンスを使用する ListFragment でヘッダーを使用するには、次のことを行う必要があります。

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

次に、ヘッダーを必要な方向にのみ追加します。これは素晴らしいことです。それについての否定的な部分は、スクロールが保持されず、どのアダプターを使用する必要があるかを把握する必要があることです。これらはいくつかの方法にすぎませんが、それほど悪くはありません.

于 2013-03-19T21:18:19.327 に答える