Android : ListView에서 하위보기에 액세스 없습니다 ListView. 업데이트 : 의

를 사용하여 표시된 목록에서 한 요소의 픽셀 위치를 찾아야합니다 ListView. TextView 중 하나를 얻은 다음을 사용해야 하는 것 같지만 .NET Framework의getTop() 자식보기를 얻는 방법을 알아낼 수 없습니다 ListView.

업데이트 : 의 하위 ViewGroup항목은 목록의 항목과 일대일로 대응하지 않습니다 ListView. 대신 ViewGroup의 하위 항목은 현재 표시되는보기에만 해당됩니다. 따라서 getChildAt()내부 인덱스에서 작동 ViewGroup하며 목록에서 ListView사용 하는 위치와 반드시 관련이있는 것은 아닙니다 .



답변

참조 : Android ListView : 보이는 항목의 데이터 인덱스를 가져
오고 위의 Feet 답변의 일부와 결합하면 다음과 같은 결과를 얻을 수 있습니다.

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);

이점은 ListView의 자식을 반복하지 않아 성능 저하를 일으킬 수 있다는 것입니다.


답변

이 코드는 사용하기가 더 쉽습니다.

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

답변

ListView 클래스에 대한 문서를 빠르게 검색하면 ViewGroup에서 상속 된 getChildCount () 및 getChildAt () 메서드가 나타납니다. 이것을 사용하여 반복 할 수 있습니까? 잘 모르겠지만 시도해 볼 가치가 있습니다.

여기 에서 찾았습니다


답변

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));
            }
        }
    }
});

기본적으로 두 개의 드로어 블을 만듭니다. 하나는 투명하고 다른 하나는 원하는 색상입니다. 클릭 한 위치 ( int position정의 된대로) 에서 포커스를 요청하고 해당 행의 색상을 변경합니다. 그런 다음 부모를 살펴보고 ListView그에 따라 다른 모든 행을 변경합니다. 이것은 사용자가 listview여러 번 클릭하는 경우를 고려 합니다. 이 작업은의 각 행에 대한 사용자 지정 레이아웃으로 수행됩니다 ListView. (매우 간단합니다. a를 사용하여 새 레이아웃 파일을 만드십시오 TextView.-포커스 또는 클릭 가능으로 설정하지 마십시오!).

맞춤 어댑터가 필요하지 않음-사용 ArrayAdapter


답변

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

답변

이것은 ListView에서 요소의 위치를 ​​알고 있다고 가정합니다.

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

그런 다음 getLeft () 및 getTop ()을 호출하여 화면 위치의 요소를 결정할 수 있어야합니다.