Pergunta

Preciso descobrir a posição de pixel de um elemento em uma lista que foi exibida usando um ListView. Parece que eu deveria conseguir um dos TextView's e depois use getTop(), mas não consigo descobrir como obter uma visão infantil de um ListView.

Atualizar: Os filhos do ViewGroup Não corresponda 1 para 1 com os itens da lista, para um ListView. Em vez disso, o ViewGroupAs crianças correspondem apenas às visões visíveis agora. Então getChildAt() opera em um índice interno para o ViewGroup e não tem necessariamente nada a ver com a posição na lista que o ListView usos.

Foi útil?

Solução

Ver: Android ListView: Obtenha o índice de dados do item visívelE combine com parte da resposta de pés acima, pode dar algo como:

int wantedPosition = 10; // Whatever position you're looking for
int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount(); // This is the same as child #0
int wantedChild = wantedPosition - firstPosition;
// Say, first visible position is 8, you want position 10, wantedChild will now be 2
// So that means your view is child #2 in the ViewGroup:
if (wantedChild < 0 || wantedChild >= listView.getChildCount()) {
  Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen.");
  return;
}
// Could also check if wantedPosition is between listView.getFirstVisiblePosition() and listView.getLastVisiblePosition() instead.
View wantedView = listView.getChildAt(wantedChild);

O benefício é que você não está iterando os filhos do ListView, o que pode sofrer um sucesso.

Outras dicas

Este código é mais fácil de usar:

 View rowView = listView.getChildAt(viewIndex);//The item number in the List View
    if(rowView != null)
        {
           // Your code here
        }

Uma pesquisa rápida nos métodos Docs for the ListView apareceu getChildCount () e getChildat () herdados do ViewGroup. Você pode iterar através deles usando isso? Não tenho certeza, mas vale a pena tentar.

Encontrei aqui

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
        View v;
        int count = parent.getChildCount();
        v = parent.getChildAt(position);
        parent.requestChildFocus(v, view);
        v.setBackground(res.getDrawable(R.drawable.transparent_button));
        for (int i = 0; i < count; i++) {
            if (i != position) {
                v = parent.getChildAt(i);
                v.setBackground(res.getDrawable(R.drawable.not_clicked));
            }
        }
    }
});

Basicamente, crie dois Drawables - um que é transparente e outro que é a cor desejada. Solicite o foco na posição clicada (int position conforme definido) e mude a cor da referida linha. Então caminhe pelo pai ListView, e mudar todas as outras linhas de acordo. Isso explica quando um usuário clica no listview várias vezes. Isso é feito com um layout personalizado para cada linha no ListView. (Muito simples, basta criar um novo arquivo de layout com um TextView - Não defina foco ou clique!).

Não é necessário adaptador personalizado - use ArrayAdapter

int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);

Isso pressupõe que você conhece a posição do elemento no ListView:

  View element = listView.getListAdapter().getView(position, null, null);

Em seguida, você poderá chamar getLeft () e gettop () para determinar os elementos na posição da tela.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top