Programing

ArrayAdapter의 getViewTypeCount 및 getItemViewType 메소드

lottogame 2020. 6. 7. 00:40
반응형

ArrayAdapter의 getViewTypeCount 및 getItemViewType 메소드


누군가 평범한 단어로 사용법 getViewTypeCount()getItemViewType()방법을 설명 할 수 있습니까 ArrayAdapter?


마다 다른 유형 의보기를 원하는 경우를 처리합니다 . 예를 들어, 연락처 애플리케이션에서 행에도 왼쪽에 그림이 있고 홀수 행에 오른쪽에 그림이있을 수 있습니다. 이 경우 다음을 사용합니다.

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    return position % 2;
}

프레임 워크는 뷰 유형을 사용 하여 메소드 에서 처리 할 뷰를convertViewgetView 결정 합니다 . 즉, 위의 예에서 짝수 행은 재사용 할 수 있도록 왼쪽에 그림이있는 재활용 뷰만 가져오고 홀수 행은 오른쪽에 그림이있는 뷰만 가져옵니다.

목록의 모든 행이 동일한 레이아웃을 갖는 경우 뷰 유형에 대해 걱정할 필요가 없습니다. 실제로 BaseAdapter.java 는 모든 어댑터에 대한 기본 동작을 제공합니다.

public int getItemViewType(int position) {
    return 0;
}

public int getViewTypeCount() {
    return 1;
}

이것은 실제로 모든 행에 대해 동일한 뷰 유형을 제공합니다.

편집 -일반적인 흐름을 설명합니다.

  1. AdapterView어댑터를 사용하여 데이터를 바인딩합니다 .
  2. AdapterView시도는 사용자가 볼 수있는 항목을 표시합니다.
  3. 프레임 워크는 표시 getItemViewType할 행인 row를 호출 n합니다.
  4. 프레임 워크는 재활용 된 뷰 풀에서 행 n유형 의 뷰를 확인 합니다. 뷰가 아직 재활용되지 않았기 때문에 아무것도 찾지 못했습니다.
  5. getViewrow를 호출합니다 n.
  6. 사용할 뷰 유형을 결정 getItemViewType하기 위해 행 n호출 합니다.
  7. 필요한 뷰 유형에 따라 if / switch 문을 사용하여 다른 xml 파일을 부 풀릴 수 있습니다.
  8. 뷰를 정보로 채 웁니다.
  9. 뷰를 종료 getView하고 종료 하면 행의 뷰가 사용자에게 표시됩니다.

이제 화면을 스크롤하여보기를 재활용하면 프레임 워크에서 관리하는 재활용보기 풀로 이동합니다. 이들은 본질적으로 뷰 유형별로 구성되므로 메소드의 convertView매개 변수에서 올바른 유형의 뷰가 제공됩니다 getView.

  1. 프레임 워크는 다시 getItemViewType표시하려는 행을 호출 합니다.
  2. 이번에는 해당 유형의 재활용 풀에 대한보기가 있습니다.
  3. 재활용 된 뷰는 메소드 convertView매개 변수 로 전달됩니다 getView.
  4. 재활용 된 뷰를 새로운 정보로 채우고 반환합니다.

우리가보기의 다른 유형 표시해야하는 경우 사용 후의 좋은 목록을-보기 getViewTypeCount()getItemViewType()보기를 전환하는 대신 어댑터 View.GONEView.VISIBLE매우 비싼 작업 내부 될 수 있습니다 getView()목록 스크롤에 영향을 미칠 것입니다.

어댑터 사용 getViewTypeCount()getItemViewType()어댑터에 대해서는이 항목을 확인하십시오 .

링크 : get-use-of-getviewtypecount


조심해 !!!! 어제
구현하는 문제에 직면해야했고 ListView스크롤 한 직후에 행에 대한 두 가지 유형의 뷰가 뒤죽박죽이되었습니다. 이 스레드 내에서 가장 많이 투표 된 답변은 일반적인 설명을 제공하지만 위에서 언급 한 위의 UI 버그를 막기 위해 가장 중요한 정보는 강조하지 않았습니다.

Here is my explanation:
Both getViewTypeCount() and getItemViewType() are being used by BaseAdapter's getView method to find out which type of a view should it be fetch, recycled and returned. (as explained in the top answer within the thread). But if you don't implement these two methods intuitively according to the Android API Doc, then you might get into the problem I mentioned about.

Summarized Guideline for the implementation:
To implement multiple types of Views for ListView's rows we have to essentially implement, getItemViewType() and getViewTypeCount() methods. And getItemViewType() documentation gives us a Note as follows:

Note: Integers must be in the range 0 to getViewTypeCount() - 1. IGNORE_ITEM_VIEW_TYPE can also be returned.

So in your getItemViewType() you should return values for the View Type, starting from 0, to the last type as (number of types - 1). For example, let's say you only have three types of views? So depending on the data object for the view, you could only return 0 or 1 or 2 from the getItemViewType() method, like a zero-based array index. And as you have three types of views used, your getViewTypeCount() method must return 3.

In any case if you return any other integer values like 1, 2, 3 or 111, 222, 333 for this method you definitely might experience the above UI bug which you just placed by not obeying to the Android API Doc.

If you didn't get the clue or couldn't still resolve and need further information please read my detailed answer within this StackOverflow Q&A thread.

Read the Android Developer Doc for further information you might be find the clue directly.

Hope this answer might be helpful to someone out there to save a lots of hours!!!

Cheers!!!

참고URL : https://stackoverflow.com/questions/5300962/getviewtypecount-and-getitemviewtype-methods-of-arrayadapter

반응형