>

Listview에 대한 사용자 정의 배열 어댑터가 있는데 연락처에 사용하고 있습니다. 목록을보다 체계적으로 구성하기를 원했기 때문에 연락처 이름의 첫 번째 문자에 헤더를 추가하고 싶습니다. 이것은 나의 현재 진행 상황입니다 :

@NonNull
    @Override
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        View listItem = convertView;
        LinearLayout header = null;
        String preLabel = " ";
        char firstChar = ' ';
        final Contact c = Contacts.get(position);
        String label = c.name;
        if(position != 0) {//OOb prevention
            preLabel = Contacts.get(position - 1).name;
            firstChar = label.toUpperCase().charAt(0);
        }

        char preFirstChar = preLabel.toUpperCase().charAt(0);
        if (listItem == null) {
            //If its the 1st position or the 1st character of the name is different inflate the layout with a header, else inflate the other layout.
            if(position==0 || firstChar != preFirstChar) {
                listItem = LayoutInflater.from(mContext).inflate(R.layout.contacts_list_item, parent, false);
                header  = (LinearLayout) listItem.findViewById(R.id.section);
                setSection(header, label);
            }else{
                listItem = LayoutInflater.from(mContext).inflate(R.layout.contacts_list2, parent, false);
            }
        }//Etc etc

이 코드보다 더 많은 코드를 추가하는 것이 적절하다고 생각하지 않으며 헤더를 넣을 때를 결정하는 논리가 잘못된 경우에도 내가 아래로 스크롤 할 때 이상한 동작이 발생합니다. 위로 스크롤하면 뷰가 보이지 않거나 파괴되지 않습니다 .0 위치에 헤더가 없습니다.

갑자기 그대로 똑같이 계속하면 자체적으로 수정되고 이제 첫 번째 위치에 다시 머리글이 있으며 다시 스크롤하면 왜 이런 일이 발생하지 않습니까? 어댑터가보기를 작성하는 데 사용하는 다른 방법이 있습니까? 더 빠른 레이아웃을 사용할 레이아웃을 예측하려고합니까?

오류의 시각적 참조 :

위치 0을 볼 수 있듯이 (간단히하기 위해 연락처 이름 대신 텍스트보기에 위치 번호를 입력) 시작 부분에 헤더가 있고 조금 스크롤 한 후 사라지고 다시 나타납니다. .

  • 답변 # 1

    스크롤하고보기가 가시 영역을 벗어나면 ListView는 목록의 다른 위치에 대해 동일한 팽창 된보기를 재사용합니다.

    따라서 getView 에 논리가 있다면  때때로 R.layout.a 를 팽창시킬 수있는 방법  때로는 R.layout.b 를 팽창  문제가 생길 수 있습니다. 왜냐하면 convertView 를 얻을 수 있기 때문입니다.   a 유형의 재사용이 필요합니다.  그러나 b 유형의보기가 필요합니다.  목록에서이 특정 위치에 대해

    해결책은 ViewType 를 사용하는 것입니다. s, 이것은 두 가지 유형의 레이아웃이 있음을 ListView에 알리는 방법이며 특정 유형을 재활용 할 수있는 시점과 어떤 View 를 알 수 있는지를 알려줍니다 .

    기본적으로 재정의 getViewTypeCount() 를 반환해야합니다  2를 반환하고 (두 가지 유형의 레이아웃이 있음) getItemViewType(int position) 에 헤더가 필요한지 여부를 확인하는 논리를 이동하십시오. .

    여기를 참조하십시오 : 각 행마다 다른 레이아웃을 가진 Android ListView

관련 자료

  • 이전 typescript - Angular Universal Express 서버는 계속로드되고 ERR_EMPTY_RESPONSE와 함께 실패합니다
  • 다음 Eclipse에서 Java 코드를 실행할 때 명령 줄 매개 변수를 추가하는 방법은 무엇입니까?