기계적 인조 인간:ListView에서 하위 뷰에 액세스
-
05-07-2019 - |
문제
다음을 사용하여 표시된 목록에서 한 요소의 픽셀 위치를 찾아야 합니다. ListView
.둘 중 하나는 받아야 할 것 같습니다 TextView의 그런 다음 사용 getTop()
, 하지만 어린이의 관점에서 볼 수 있는 방법을 알 수 없습니다. ListView
.
업데이트: 의 아이들 ViewGroup
목록에 있는 항목과 1:1로 일치하지 않습니다. 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 클래스에 대한 문서를 빠르게 검색하면 getChildCount () 및 getChildat () 메소드가 ViewGroup에서 상속되었습니다. 이것들을 사용하여 그들을 통해 반복 할 수 있습니까? 확실하지 않지만 시도해 볼 가치가 있습니다.
그것을 발견 여기
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
. (매우 간단하게, 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()을 호출하여 화면 위치의 요소를 결정할 수 있어야 합니다.