Agregar / Eliminar encabezado y pie de página dinámicamente

Necesito poder agregar y eliminar encabezados y pies de página de miListView dinámicamente.

Así que inicializo mi actividad con mis encabezados y pies de página, luego en algún momento quiero ocultarlos, y luego necesito agregar los encabezados y pies de página anteriores, y mantener el mismoAdapter.

Así que encontré esta solución, pero es fea y realmente espero que haya otra manera.
Básicamente, tengo que configurar un adaptador nulo para poder agregar la vista de encabezado y luego configurar un adaptador vacío para agregar la vista de pie de página. Para terminar configuro mi adaptador real.

Edit: Debo agregar que usar el atributo de visibilidad (GONE & VISIBLE) no es una solución aquí, porque las vistas de encabezados y pies de página no deben estar en el adaptador durante mi procedimiento intermedio.

    public class TestAdapterHeader extends ListActivity implements OnClickListener {
        private static String[] items = { "test 1", "test 2", "test 3", "test 4",
                "test 5", "test 6", "test 7", "test 8", "test 9", "test 10",
                "test 11", "test 12", "test 13", "test 14", "test 15", "test 16",
                "test 17", "test 18", "test 19", "test 20" };

        private ArrayAdapter mAdapter;
        private LinearLayout mParentView;
        private TextView mHeaderView, mFooterView;

        priv,ate boolean mViewsHidden = false;


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

            initViews();

            mAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, items);
            setListAdapter(mAdapter);
        }


        private void initViews() {
            // The main layout
            mParentView = new LinearLayout(this);
            mParentView.setOrientation(LinearLayout.VERTICAL);
            mParentView.setBackgroundColor(Color.BLACK);

            // The button to hide the views
            Button hideViewsButton = new Button(this);
            hideViewsButton.setText("Add/Remove views");
            hideViewsButton.setOnClickListener(this);

            // The listview
            ListView listView = new ListView(this);
            listView.setId(android.R.id.list);
            listView.setCacheColorHint(Color.TRANSPARENT);

            mParentView.addView(hideViewsButton);
            mParentView.addView(listView);

            // Set the content view
            setContentView(mParentView);

            AbsListView.LayoutParams lp = new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, 150);

            mHeaderView = new TextView(this);
            mHeaderView.setTextColor(Color.WHITE);
            mHeaderView.setBackgroundColor(Color.BLUE);
            mHeaderView.setGravity(Gravity.CENTER);
            mHeaderView.setLayoutParams(lp);
            mHeaderView.setText("Header");

            mFooterView = new TextView(this);
            mFooterView.setTextColor(Color.WHITE);
            mFooterView.setBackgroundColor(Color.BLUE);
            mFooterView.setGravity(Gravity.CENTER);
            mFooterView.setLayoutParams(lp);
            mFooterView.setText("Footer");


            getListView().addHeaderView(mHeaderView);
            getListView().addFooterView(mFooterView);
        }


        @Override
        public void onClick(View v) {
            mViewsHidden = !mViewsHidden;

            // Remove header & footer views
            if (mViewsHidden) {
                getListView().removeHeaderView(mHeaderView);
                getListView().removeFooterView(mFooterView);
            } 
            else {
                // Remove the ListAdapter to be able to add our headerView
                setListAdapter(null);
                getListView().addHeaderView(mHeaderView);

                // Set an empty ListAdapter to be able to add our footerView
                setListAdapter(new ArrayAdapter<String>(TestAdapterHeader.this, -1));
                getListView().addFooterView(mFooterView);

                // Re set our Adapter
                setListAdapter(mAdapter);
            }

            mParentView.requestLayout();

        }
    }

Respuestas a la pregunta(22)

Su respuesta a la pregunta