Eu consegui uma boa solução com este:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- This is the line -->
<item android:top="-1dp" android:right="-1dp" android:left="-1dp">
<shape>
<solid android:color="@android:color/transparent" />
<stroke android:width="1dp" android:color="#ffffff" />
</shape>
</item>
</layer-list>
Isso funciona bem no caso de você precisar de um fundo transparente, mas ainda de uma cor de traço aberta (no meu caso, eu só precisava de uma linha de fundo). Se precisar de uma cor de fundo, você pode adicionar uma cor de forma sólida como na resposta de Maragues.
EDITAR 1
Às vezes, para dispositivos de alta densidade, o uso de valores de mergulho baixos pode resultar em cursos ou distâncias muito finas ou invisíveis. Isso pode acontecer com você também ao definir os divisores ListView.
A solução mais simples é usar uma distância de 1px em vez de 1dp. Isso tornará a linha sempre visível em todas as densidades. A melhor solução seria criar recursos de dimensão para cada densidade, para obter o melhor tamanho para cada dispositivo.
Editar 2
Divertido, mas tentei usar 6 anos depois e não consigo obter um bom resultado nos dispositivos Lollipop.
Provavelmente, a solução atual é usar 9 patches. O Android deveria ter criado uma solução fácil para esse problema depois de todo esse tempo.
Sei que esta pergunta foi postada há muito tempo, então a resposta não será usada pela pessoa que postou esta pergunta, mas ainda pode ajudar outras pessoas.
Use a
inset
tag e dê um valor negativo para a borda lateral que você deseja remover.Os valores possíveis são:
android:insetTop="-1dp" android:insetBottom="-1dp" android:insetLeft="-1dp" android:insetRight="-1dp"
fonte
Resolvi isso usando uma camada de lista, combinando duas formas, uma das quais com altura de 1 dp colocada na parte inferior
optionscreen_bottomrectangle.xml:
Então, no arquivo layout / main.xml
O que preenche a lacuna entre table_options e exit_bar com um fundo e pouco antes de exit_bar imprimir uma linha de 1dp. Isso funcionou para mim, espero que ajude outra pessoa.
Resposta editada para colocar as camadas na ordem correta. Thx Alex!
fonte
Outra abordagem das outras respostas usando preenchimento. Este pequeno recorte faz uma borda na parte superior e inferior.
fonte
A resposta de @Maragues é invertida, pois os drawables da lista de camadas são desenhados de cima para baixo (o que significa que o último item da lista é desenhado no topo):
Isso preencherá efetivamente a forma com a cor da linha e, em seguida, desenhará a cor de fundo sobre ela, deixando o último 1dp livre para que a cor da linha apareça.
fonte
fonte
Eu usei o seguinte código.
fonte