source

커스텀 listview어댑터의 getView메서드가 여러 번 호출되고 일관성 없는 순서로 호출됨

factcode 2022. 8. 30. 22:09
반응형

커스텀 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개의 아이템이 있는 경우 드롭다운이 너무 커짐) 여러 콜의 문제(더 중요한 문제)는 해결되었습니다.

고마워!!

(<고객명>>을 마친 후)heightListView로로 합니다.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

반응형