커스텀 listview어댑터의 getView메서드가 여러 번 호출되고 일관성 없는 순서로 호출됨
사용자 지정 목록 어댑터가 있습니다.
class ResultsListAdapter extends ArrayAdapter<RecordItem> {
오버라이드된 'getView' 메서드에서는 인쇄를 수행하여 위치가 무엇인지, convertView인지 여부를 확인합니다.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView " + position + " " + convertView);
이 출력(목록이 처음 표시될 때 아직 사용자 입력 없음)
04-11 16:24:05.860: INFO/System.out(681): getView 0 null
04-11 16:24:29.020: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43d415d8
04-11 16:25:48.070: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43d415d8
04-11 16:25:49.110: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43d415d8
04-11 16:25:49.710: INFO/System.out(681): getView 0 android.widget.RelativeLayout@43d415d8
04-11 16:25:50.251: INFO/System.out(681): getView 1 null
04-11 16:26:01.300: INFO/System.out(681): getView 2 null
04-11 16:26:02.020: INFO/System.out(681): getView 3 null
04-11 16:28:28.091: INFO/System.out(681): getView 0 null
04-11 16:37:46.180: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43cff8f0
04-11 16:37:47.091: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43cff8f0
04-11 16:37:47.730: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43cff8f0
AFAIK, 명시적으로 기술되어 있는 것을 찾을 수 없었습니다만, getView()는 눈에 보이는 행만을 호출합니다.내 앱은 4줄로 시작하므로 적어도 위치 번호가 0에서 3까지 순환하는 것은 의미가 있습니다.하지만 나머지는 엉망진창이다.
- 각 행에 대해 getview가 3회 호출되는 이유는 무엇입니까?
- 스크롤을 하지 않은 상태에서 이러한 convertView는 어디에서 생성됩니까?
조금 재설치를 해봤지만 좋은 답변을 얻지 못했는데, 사람들이 이 문제를 레이아웃 문제와 연관짓고 있다는 것을 알게 되었습니다.예를 들면, 리스트가 포함되는 레이아웃은 다음과 같이 목록을 포함합니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:orientation="vertical" >
<TextView android:id="@+id/pageDetails"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<ListView android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="false" />
</LinearLayout>
각 행의 레이아웃:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="108dp"
android:padding="4dp">
<ImageView
android:id="@+id/thumb"
android:layout_width="120dp"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_marginRight="8dp"
android:src="@drawable/loading" />
<TextView
android:id="@+id/price"
android:layout_width="wrap_content"
android:layout_height="18dp"
android:layout_toRightOf="@id/thumb"
android:layout_alignParentBottom="true"
android:singleLine="true" />
<TextView
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="18dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:paddingRight="4dp"
android:singleLine="true" />
<TextView
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="17dp"
android:layout_toRightOf="@id/thumb"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:paddingRight="4dp"
android:layout_alignWithParentIfMissing="true"
android:gravity="center" />
</RelativeLayout>
시간 내 주셔서 감사합니다
이것은 문제가 아닙니다. 이 주문에 대한 보장은 전혀 없습니다.getView()
몇 번을 불러야 할지...특히 당신의 경우, 당신이 할 수 있는 가장 나쁜 일을 하고 있다.ListView
에 의해height=wrap_content
이 힘은ListView
배치 시 어댑터에서 몇 명의 어린이를 측정하여 크기를 파악할 수 있습니다.이게 바로 우리가 제공하는 것입니다.ListView
와 함께convertViews
에 전달된 것을 알 수 있습니다.getView()
스크롤하기도 전에.
로 시험해 보다match_parent
에서layout_height
목록 보기의 속성.예방할 수 있습니다.getView()
자주 불려다녀서
layout_width와 layout_height를 모두 match_parent로 변경함으로써 이 문제를 해결했습니다(layout_height만 변경해도 도움이 되지 않습니다).
네스트된 항목이 있는 경우 주의하십시오.가장 높은 것을 match_parent로 변경해야 합니다.도움이 됐으면 좋겠는데
당신의 "Why" 질문에 대답할 수는 없지만, 짜증나는 "ListView items repeating" 문제(화면 높이보다 큰 아이템이 컬렉션에 있는 경우)에 대한 해결책은 분명히 있습니다.
위의 많은 사람들이 언급했듯이 ListVew 태그의 Android:layout_height 속성을 fill_parent로 유지합니다.
getView() 함수에 대해서는 View라는 정적 클래스를 사용합니다.홀더. 이 예시를 보세요.Array 또는 ArrayCollection 내의 모든 항목을 추가하는 작업이 정상적으로 수행됩니다.
이게 친구들에게 도움이 되었으면 좋겠어!!
안부 전해 주세요, Siddhant
Qes: 어댑터가 getView()를 여러 번 호출하는 이유는 무엇입니까?Ans: 리스트 뷰는 스크롤 시 렌더링되므로 뷰가 새로 고쳐지기 때문에 다음 뷰로 갱신됩니다.어댑터는 getView()를 호출하여 뷰를 취득해야 합니다.
Qes: listview의 폭과 높이를 fill_parent로 설정하면 왜 콜이 적어집니까?Ans: 인플레이터는 목록에 사용할 화면 영역의 크기가 고정되어 있기 때문에 화면에 보기를 렌더링하기 위해 한 번 계산됩니다.
당신의 질문이 해결되기를 바랍니다.
자동 완성 드롭다운에서도 같은 문제가 발생하였습니다.텍스트 표시내가 여기 도착할 때까지 이틀 동안 그 문제와 싸웠는데 네가 해결책을 제시해 줘.
dropDownHeight="match_parent"라고 쓰면 문제가 해결됩니다.이 문제는 UI와 관련되어 있지만(1개의 아이템이 있는 경우 드롭다운이 너무 커짐) 여러 콜의 문제(더 중요한 문제)는 해결되었습니다.
고마워!!
(<고객명>>을 마친 후)height
ListView
로로 합니다.match_parent
이치노력하다
'아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.height
을 「」로 합니다.match_parent
.
아래의 예를 참조해 주세요.LinearLayout
서의 부모입니다
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/something" />
<ListView
android:id="@+id/friendsList"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
"getview가 각 행에 대해 3번 호출되는 이유는 무엇입니까?"getView는 listview를 스크롤하면 호출되기 때문에 listview의 위치가 변경되었을 때 호출됩니다.
저도 같은 문제를 겪고 있어요.높이를 fill_parent로 설정하면 "보통" 행당 2개의 콜이 수신됩니다.단, ListView의 높이를 300dp로 설정하면 GetView콜이 한 줄에 딱 1개만 표시됩니다.
따라서 화면 높이를 먼저 결정하고 다음으로 프로그램적으로 listvilew 높이를 그 값으로 설정하는 방법밖에 없는 것 같습니다.별로인데요.더 좋은 방법이 있었으면 좋겠어요.
은 늦어질 수 , 이 게게를 사용하고 있다면layout_weight
설정해 을 잊지 않다layout_width="0dp"
내가 이 해결책을 만들었는데, 아마 최선책은 아닐지도 모르지만, 효과가...
//initialize control string
private String control_input = " ";
그러면 =
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View gridview = convertView;
// change input_array for the array you use
if (!control_input.equals(input_array[position])) {
control_input = input_array[position];
//do your magic
}
return gridview;
}
도움이 되길 바래!
언급URL : https://stackoverflow.com/questions/2618272/custom-listview-adapter-getview-method-being-called-multiple-times-and-in-no-co
'source' 카테고리의 다른 글
(VueJ) vue-router가 여러 경로를 일치시킵니다. (0) | 2022.08.30 |
---|---|
Vue Dev Tools(vue2/vuex3)에서 Vuex 스토어가 검색되지 않음 (0) | 2022.08.30 |
[Vue warn] :속성 또는 메서드가 인스턴스에서 정의되지 않았지만 렌더링 중에 참조됩니다. (0) | 2022.08.30 |
Vue JS 체크박스를 바인드하는 방법? (0) | 2022.08.30 |
배열을 비교할 때 항목 표시/숨김 (0) | 2022.08.30 |