사용자 정의 어댑터를 만들 때 getView () 메서드는 어떻게 작동합니까?


101

내 질문은 다음과 같습니다.

  1. LayoutInflater의 기능은 정확히 무엇입니까?
  2. 내가 읽은 모든 기사가 convertview가 null인지 아닌지 확인하는 이유는 무엇입니까? null 인 경우 무엇을 의미하고 그렇지 않은 경우 무엇을 의미합니까?
  3. 이 메소드가 허용하는 상위 매개 변수는 무엇입니까?

답변:


115

1 :은 LayoutInflater레이아웃 XML 파일을 가져 와서 내용과 다른 뷰 객체를 만듭니다.

2 : 어댑터는 뷰를 재사용하기 위해 제작되었습니다. 뷰가 스크롤되어 더 이상 보이지 않게되면 나타나는 새 뷰 중 하나에 사용할 수 있습니다. 이 재사용 된 뷰는 convertView. 이것이 null이면 재활용 된 뷰가없고 새 뷰를 만들어야 함을 의미합니다. 그렇지 않으면 새 뷰를 만들지 않기 위해 사용해야합니다.

3 : parent적절한 레이아웃 매개 변수를 위해 뷰를 확장 할 수 있도록 제공됩니다.

이 모든 것을 함께 사용하여 목록에 나타날보기 (또는 어댑터를 사용하는 다른보기)를 효과적으로 만들 수 있습니다.

public View getView(int position, @Nullable View convertView, ViewGroup parent){
    if (convertView == null) {
        //We must create a View:
        convertView = inflater.inflate(R.layout.my_list_item, parent, false);
    }
    //Here we can do changes to the convertView, such as set a text on a TextView 
    //or an image on an ImageView.
    return convertView;
}

의 사용에 주목 LayoutInflater, parent그것에 대한 인수로 사용할 수 있습니다 방법을 convertView다시 사용됩니다.


5
Convertview == null은 모든 itens가 동일한 레이아웃을 따를 때 유용합니다. 예를 들어 라디오 또는 체크 버튼을 확인하고 각 항목에 따라 레이아웃을 변경해야하는 경우 다시 확장하거나 캐시 된 뷰를 가져옵니다.
sagits 2015

너무 재 팽창 할 필요가 없습니다. getview에서 switch 또는 if-else 래더를 작성하고 사례에 따라 뷰를 확장하고 public int getItemViewType (int position) 및 public int getViewTypeCount ()를 재정의하면됩니다. @sagits
프라 샨스 Debbadwar

문이 일반적으로 작동하지만 라디오 버튼을 사용할 때 텍스트 및 캐시 된 뷰를 사용하여 문제가 발생한 이러한 종류의 항목을 편집 할 때 스택 오버플로에 대한 몇 가지 질문이 있습니다.
sagits

71

getView()어댑터의 메소드의 생성의 항목보기위한 ListView, Gallery...

  1. LayoutInflater(일반적으로 루트 객체와는 레이아웃 XML로 정의보기 개체를 가져 오는 데 사용됩니다 LinearLayout, FrameLayout또는 RelativeLayout)

  2. convertView재활용입니다. 한 번에 10 개의 항목 만 표시 할 수있는 목록보기가 있고 현재 항목 1-> 항목 10을 표시하고 있다고 가정 해 보겠습니다. 한 항목 아래로 스크롤하면 항목 1이 화면에서 나오고 항목 11이 표시됩니다. . 항목 11에 대한보기를 생성하기 위해 getView () 메서드가 호출되고 convertView여기에 항목 1의보기가 있습니다 (더 이상 필요하지 않음). 따라서 대신 항목 11 (비용이 많이 드는)에 대한 새 View 개체를 만듭니다. 재사용하지 convertView않겠습니까? => 우리 convertView는 null인지 아닌지 확인하고 , null이면 새 뷰를 만들고, 그렇지 않으면 재사용합니다 convertView.

  3. parentViewgetView()생성 하는 항목의보기를 포함하는 ListView 또는 Gallery ...입니다 .

참고 :이 메소드를 직접 호출하지 않고 항목의보기를 생성하는 방법을 상위보기에 알리기 위해 구현하면됩니다.


2
parentView에 대한 우수한 설명은,이보다 하나 더 좋은 설명을 찾을 수 없습니다
아메드 아델 이스마일

놀라운 설명!
gabi

훌륭한 설명 +1
tpk

8

목록보기에 대한이 비디오를 볼 수 있습니다. 지난 몇 년 동안 Google IO에서 왔으며 여전히 내 마음에있는 목록보기에 대한 최고의 연습입니다.

http://www.youtube.com/watch?v=wDBM6wVEO70

  1. 레이아웃 (res / layout / 폴더의 xml 파일)을 LinearLayout 및 기타보기와 같은 Java 개체로 확장합니다.

  2. 비디오를 보면 변환보기의 사용에 대한 최신 정보를 얻을 수 있습니다. 기본적으로 재사용 대기중인 재활용보기를 사용하여 새 개체를 만들고 목록 스크롤 속도를 늦추지 마십시오.

  3. 어댑터에서 목록보기를 참조 할 수 있습니다.


5

LayoutInflater의 기능은 정확히 무엇입니까?

XML을 사용하여 디자인 할 때 모든 UI 요소는 태그와 매개 변수 일뿐입니다. 이러한 UI 요소 (예 : TextView 또는 LinearLayout)를 사용하려면 먼저 이러한 xml 요소에 해당하는 실제 개체를 만들어야합니다. 그것이 팽창기의 목적입니다. 인플레이터는 이러한 태그와 해당 매개 변수를 사용하여 실제 개체를 만들고 모든 매개 변수를 설정합니다. 그런 다음 findViewById ()를 사용하여 UI 요소에 대한 참조를 얻을 수 있습니다.

내가 읽은 모든 기사가 convertview가 null인지 아닌지 확인하는 이유는 무엇입니까? null 인 경우 무엇을 의미하고 그렇지 않은 경우 무엇을 의미합니까?

이것은 흥미로운 것입니다. 목록의 항목이 그려 질 때마다 getView ()가 호출됩니다. 이제 항목을 그리기 전에 항목을 만들어야합니다. 이제 convertView는 기본적으로 항목을 그리는 데 마지막으로 사용 된보기입니다. getView ()에서 먼저 xml을 팽창시킨 다음 findByViewID ()를 사용하여 목록 항목의 다양한 UI 요소를 가져옵니다. (convertView == null)을 확인할 때 뷰가 null (첫 번째 항목에 대해)인지 확인한 다음 뷰를 생성하고, 이미 존재하는 경우 다시 사용하고, 팽창 프로세스를 다시 진행할 필요가 없는지 확인합니다. . 훨씬 더 효율적입니다.

또한 getView ()에서 ViewHolder 개념을 접 했어야합니다. 이것은 목록을 더 효율적으로 만듭니다. 우리가하는 일은 뷰 홀더를 생성하고 확장 후 얻은 모든 UI 요소에 대한 참조를 저장하는 것입니다. 이렇게하면 수많은 findByViewId () 호출을 피하고 많은 시간을 절약 할 수 있습니다. 이 ViewHolder는 (convertView == null) 조건에서 생성되며 setTag ()를 사용하여 convertView에 저장됩니다. else 루프에서 우리는 getView ()를 사용하여 다시 얻고 재사용합니다.

이 메소드가 허용하는 상위 매개 변수는 무엇입니까?

부모는 getView ()에 의해 생성 된 뷰가 최종적으로 첨부되는 ViewGroup입니다. 이제 귀하의 경우 이것은 ListView입니다.

도움이 되었기를 바랍니다 :)


4
  1. 레이아웃 팽창기는 현재보기에 외부 XML을 확장 / 추가합니다.

  2. getView ()는 스크롤 될 때를 포함하여 여러 번 호출됩니다. 따라서 이미 뷰가 부풀려 졌다면 부 풀리는 것은 비용이 많이 드는 프로세스이기 때문에 다시는하고 싶지 않습니다. 이것이 null인지 확인한 다음 부 풀리는 이유입니다.

  3. 상위보기는 목록의 단일 셀입니다 ..


3
여기에서는 상위 뷰가 잘못 설명되어 있습니다. ListItem이 아닌 ListView가됩니다
Varun Jain

2

LayoutInflaterListView항목 또는 onCreateView단편 에 대한 XML의 동적보기를 생성하는 데 사용됩니다 .

ConvertView기본적으로 현재 뷰에없는 뷰를 재활용하는 데 사용됩니다. 스크롤 가능한 ListView. 아래 또는 위로 스크롤하면 스크롤 convertView된보기가 제공됩니다. 이 재사용은 메모리를 절약합니다.

getView()메서드 의 부모 매개 변수 는 listView가있는 부모 레이아웃에 대한 참조를 제공합니다. 사용할 수있는 상위 XML에있는 항목의 ID를 얻고 싶다고 가정 해 보겠습니다.

ViewParent nv = parent.getParent();

while (nv != null) {

    if (View.class.isInstance(nv)) {
        final View button = ((View) nv).findViewById(R.id.remove);
        if (button != null) {
            // FOUND IT!
            // do something, then break;
            button.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Log.d("Remove", "Remove clicked");

                    ((Button) button).setText("Hi");
                }
            });
        }
        break;
    }

 }

1

getView()method create new View또는 ViewGroup각 행 Listview또는 Spinner. 이것을 정의 View하거나 폴더 ViewGroupLayout XML파일에서 정의 res/layout할 수 있으며 참조를 AdapterObject 클래스에 제공 할 수 있습니다 .

Adapter에 전달 된 배열에 4 개의 항목이있는 경우. getView()메서드는 Adaper의 4 개 행에 대해 4 개의 뷰를 생성합니다.

LayoutInflater 클래스에는 XML 리소스 레이아웃에서 View Object를 만드는 동안 inflate () 메서드가 있습니다.


0

Adapter.java 파일의 Adapter 인터페이스에서 getView에 대한 유용한 정보를 찾을 수도 있습니다. 그것은 말한다;

/**
 * Get a View that displays the data at the specified position in the data set. You can either
 * create a View manually or inflate it from an XML layout file. When the View is inflated, the
 * parent View (GridView, ListView...) will apply default layout parameters unless you use
 * {@link android.view.LayoutInflater#inflate(int, android.view.ViewGroup, boolean)}
 * to specify a root view and to prevent attachment to the root.
 * 
 * @param position The position of the item within the adapter's data set of the item whose view
 *        we want.
 * @param convertView The old view to reuse, if possible. Note: You should check that this view
 *        is non-null and of an appropriate type before using. If it is not possible to convert
 *        this view to display the correct data, this method can create a new view.
 *        Heterogeneous lists can specify their number of view types, so that this View is
 *        always of the right type (see {@link #getViewTypeCount()} and
 *        {@link #getItemViewType(int)}).
 * @param parent The parent that this view will eventually be attached to
 * @return A View corresponding to the data at the specified position.
 */
View getView(int position, View convertView, ViewGroup parent);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.