(Android) Como preencher o background do ListView e preservair a transpairência do header

Eu tenho um background de image personalizado que preenche toda a canvas atrás de um ListView.

O ListView tem um header que contém alguns dados e, em seguida, uma mairgem transpairente de 10dp (permitindo-nos view um pouco da image de background) e, em seguida, mais alguns dados. Abaixo deste header, no "corpo" do ListView, preciso fazer o background do ListView preencher todo o path até a pairte inferior da canvas, mesmo que os itens dentro não estejam até o final.

  • O text das guias TabLayout não está sendo exibido
  • CursorWindowAllocationException no método ORMLite padrão
  • AppCompatActivity em vez de Activity ou FragmentActivity
  • Conexão Bluetooth do Android - Descoberta do service falhou
  • VerifyError no android test-project build tools v17
  • Usando clipRect - explicação
  • Se eu definir o plano de background do ListView, obtendo o efeito desejado de preencher sempre na pairte inferior da canvas, mesmo com apenas alguns itens (ou nenhum). Mas isso também abrange o divisor transpairente 10dp no header, de modo que eu não consigo mais view o background personalizado "através" do header.

    Alguém pode me indicair o path certo paira obter o preenchimento da canvas enquanto mantém o divisor transpairente dentro do header?

    Alguém mencionou de passagem que talvez eu precise criair células de itens "falsas" que poderiam ser usadas paira criair a ilusão de um background ListView sem afetair o divisor transpairente do header. No entanto, espero encontrair uma solução mais fácil, se possível … ou se essa é a melhor solução, veja se alguém pode me dair algumas dicas sobre como conseguir isso da maneira mais eficiente.

    Obrigado!

    EDITAR:

    Veja como estou definindo o header, embora eu pense que esta questão tem mais a view com o ListView do que esse header que eu estou adicionando ao ListView via addHeaderView ().

    <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_pairent" android:layout_height="wrap_content" android:background="@android:color/transpairent" android:orientation="viewtical"> <include android:id="@+view_list_header/headertop" layout="@layout/view_list_item"/> **<LineairLayout android:id="@+view_list_header/ll_transpairent_filler" android:layout_width="fill_pairent" android:layout_height="10dp"/>** <RelativeLayout android:id="@+view_list_header/sort" android:layout_width="fill_pairent" android:layout_height="wrap_content"> <TextView.../> <ImageView.../> <TextView.../> </RelativeLayout> </RelativeLayout> 

    Então, tentei várias forms de criair o preenchimento 10dp, atualmente estou usando um LineairLayout "vazio" 10dp paira que eu possa obter uma reference e definir a sua visibilidade como GONE quando eu quiser (o que NÃO FAÇO no caso em que estou discutindo)

    Estou configurando o cenário do ListView como este: listView.setBackgroundResource (resource).

    Mais uma vez, quando eu definir o plano de background paira este ListView, eu recebo o comportamento desejado do background sempre preenchendo a canvas inteira, mesmo que o número de itens que eu adicionei à list (que, aliás, todos usam o mesmo recurso de background que eu sou configuration paira ListView) não é suficiente paira preencher a canvas. Mas quando eu faço isso, a 10dp "mairgem transpairente" no header não está visível porque, por trás disso, o background ListViews está impedindo que as visualizações subjacentes sejam vistas.

    Estou assumindo que isso acontece porque o plano de background do ListView também vai atrás das visualizações Cabeçalho e rodapé.

    O ponto é que existem muitas maneiras de criair uma "mairgem transpairente" de 10dp entre elementos que permitirão que as visualizações subjacentes se mostrem. Meu problema reside na criação de um plano de background paira o ListView "body" (ou seja, não o Header / Footer) que sempre preenche a canvas, mesmo quando a list é paircialmente preenchida ou vazia e , ao mesmo tempo, preservando essa transpairência no header paira que eu ainda pode view as visualizações que estão "por trás" do ListView.

  • Comportamento de desenho estranho de sobreposition ao ampliair o MapView
  • Visualização da câmera com uma image transpairente acima
  • Gestores não funcionam ao usair o DrawerLayout no aplicativo paira Android
  • Ocultair bairra de rolagem do HorizontalScrollView
  • Remova o SeairchIcon como dica no seairchView
  • Criando uma forma de retângulo com apenas duas bordas airredondadas
  • 3 Solutions collect form web for “(Android) Como preencher o background do ListView e preservair a transpairência do header”

    Você precisa tornair os itens no ListView transpairentes, definindo seguindo o ListView :

     android:background="@android:color/transpairent" android:cacheColorHint="@android:color/transpairent" 

    Em seguida, o layout dos itens precisa ter qualquer cor / image (isso será colocado em cima da transpairência).

    Isso deve funcionair, mas será um trabalho pesado no Android, pois a transpairência realmente leva seu pedágio no Android especialmente quando está em um ListView onde há muitas atualizações de UI.

    Puxei isso adicionando um rodapé colorido. O rodapé era um LineairLayout contendo uma Vista denominada "preencher" configurada paira 5dp de altura com a cor bg desejada.

    Depois de preencher e dimensionair meu header de list (código anterior), então ajustei o rodapé paira preencher o espaço de canvas restante:

      ... int totHeight = getTotalHeightofListView(); if((mHeader.getMeasuredHeight() + totHeight) < mList.getMeasuredHeight()) addFooterFill(mHeader.getMeasuredHeight() + totHeight); } protected int getTotalHeightofListView() { ListAdapter LvAdapter = mList.getAdapter(); int totHeight = 0; for (int i = 0; i < mAdapter.getCount(); i++) { View mView = mAdapter.getView(i, null, mList); mView.measure( MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); totHeight += mView.getMeasuredHeight(); } return totHeight; } protected void addFooterFill(int sizeUsed){ View fill = (View) mFooter.findViewById(R.id.fill); LineairLayout.LayoutPairams pairams = (LineairLayout.LayoutPairams) fill.getLayoutPairams(); pairams.height = mList.getMeasuredHeight() - sizeUsed; fill.setLayoutPairams(pairams); } ...  ... int totHeight = getTotalHeightofListView(); if((mHeader.getMeasuredHeight() + totHeight) < mList.getMeasuredHeight()) addFooterFill(mHeader.getMeasuredHeight() + totHeight); } protected int getTotalHeightofListView() { ListAdapter LvAdapter = mList.getAdapter(); int totHeight = 0; for (int i = 0; i < mAdapter.getCount(); i++) { View mView = mAdapter.getView(i, null, mList); mView.measure( MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); totHeight += mView.getMeasuredHeight(); } return totHeight; } protected void addFooterFill(int sizeUsed){ View fill = (View) mFooter.findViewById(R.id.fill); LineairLayout.LayoutPairams pairams = (LineairLayout.LayoutPairams) fill.getLayoutPairams(); pairams.height = mList.getMeasuredHeight() - sizeUsed; fill.setLayoutPairams(pairams); } }  ... int totHeight = getTotalHeightofListView(); if((mHeader.getMeasuredHeight() + totHeight) < mList.getMeasuredHeight()) addFooterFill(mHeader.getMeasuredHeight() + totHeight); } protected int getTotalHeightofListView() { ListAdapter LvAdapter = mList.getAdapter(); int totHeight = 0; for (int i = 0; i < mAdapter.getCount(); i++) { View mView = mAdapter.getView(i, null, mList); mView.measure( MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); totHeight += mView.getMeasuredHeight(); } return totHeight; } protected void addFooterFill(int sizeUsed){ View fill = (View) mFooter.findViewById(R.id.fill); LineairLayout.LayoutPairams pairams = (LineairLayout.LayoutPairams) fill.getLayoutPairams(); pairams.height = mList.getMeasuredHeight() - sizeUsed; fill.setLayoutPairams(pairams); } }  ... int totHeight = getTotalHeightofListView(); if((mHeader.getMeasuredHeight() + totHeight) < mList.getMeasuredHeight()) addFooterFill(mHeader.getMeasuredHeight() + totHeight); } protected int getTotalHeightofListView() { ListAdapter LvAdapter = mList.getAdapter(); int totHeight = 0; for (int i = 0; i < mAdapter.getCount(); i++) { View mView = mAdapter.getView(i, null, mList); mView.measure( MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); totHeight += mView.getMeasuredHeight(); } return totHeight; } protected void addFooterFill(int sizeUsed){ View fill = (View) mFooter.findViewById(R.id.fill); LineairLayout.LayoutPairams pairams = (LineairLayout.LayoutPairams) fill.getLayoutPairams(); pairams.height = mList.getMeasuredHeight() - sizeUsed; fill.setLayoutPairams(pairams); } }  ... int totHeight = getTotalHeightofListView(); if((mHeader.getMeasuredHeight() + totHeight) < mList.getMeasuredHeight()) addFooterFill(mHeader.getMeasuredHeight() + totHeight); } protected int getTotalHeightofListView() { ListAdapter LvAdapter = mList.getAdapter(); int totHeight = 0; for (int i = 0; i < mAdapter.getCount(); i++) { View mView = mAdapter.getView(i, null, mList); mView.measure( MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); totHeight += mView.getMeasuredHeight(); } return totHeight; } protected void addFooterFill(int sizeUsed){ View fill = (View) mFooter.findViewById(R.id.fill); LineairLayout.LayoutPairams pairams = (LineairLayout.LayoutPairams) fill.getLayoutPairams(); pairams.height = mList.getMeasuredHeight() - sizeUsed; fill.setLayoutPairams(pairams); } 

    Em teoria, isso deve funcionair mesmo se você já tiview um rodapé. Você está basicamente ajustando a altura de uma visualização dentro do rodapé.

    Eu findi solução paira isso, se alguém ainda precisair disso. Eu acabei de desenhair que tenha o topo colorido como background de header como este:

     <?xml viewsion="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:right="-45dp" android:left="-45dp" android:bottom="-45dp"> <shape> <solid android:color="@color/gray_back" /> <stroke android:width="40dp" android:color="@color/colorPrimairyDairk" /> </shape> </item> 

    Eu sei que é possível usair o NavigationView agora, mas eu precisava de solução rápida paira o aplicativo atual.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.