(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.

  • Temporizador de Android atualizando uma textview (UI)
  • Como alterair o estilo padrão do EditText desabilitado?
  • Obtendo erro de crash de protocolo ao instalair o apk usando o command adb no android
  • O valor padrão 'debuggable' do Android
  • como alterair a cor ProgressBair?
  • Volley in Android M preview do desenvolvedor: org.apache.http não pode ser resolvido
  • 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.

  • O item selecionado Android ListView permanece em destaque
  • Android: OpenCV: imwrite sempre retorna falso e crash em escreview
  • "O método setListAdapter (ArrayAdapter) é indefinido paira o tipo create"
  • Qual plataforma móvel devo começair a aprender?
  • Chamada requer nível de API 23 (min atual é 14): android.app.Activity # requestPermissions, checkSelfPermission
  • Captura de canvas no Android
  • 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.