1

ListView에 대한 사용자 정의 ArrayAdapter은 XML로 별도로 정의 된 사용자 정의 행 레이아웃을 사용합니다. 레이아웃은 RelativeLayout에 합쳐진 TextViewsImageView의 3 개입니다. 성능 향상을 위해 어댑터는 here과 같은 ViewHolder 시스템을 사용하여 새로운 뷰를 확장하지 않고 기존 뷰를 변환합니다. ArrayAdapter.getView()에서 어댑터는 부울 값에 따라 첫 번째 TextView를 굵게 또는 굵게 표시해야합니다.Android ArrayAdapter가 제대로 변환되지 않습니다.

처음 앱을 열면 모든 TextView가 제대로 굵게 표시되거나 굵게 표시되지 않습니다. 그러나 ListView의 맨 아래로 스크롤 한 다음 맨 위로 스크롤하면 모든 제목 TextViews가 굵은 글씨로 표시됩니다. 나는 그것이 이미 과감한 기존의 견해를 전환하는 것과 관련이 있다고 생각하지만, 그것이 무엇인지 알 수는 없다. Android Studio를 사용하여 앱을 디버깅했으며, 정상적으로 실행될 것입니다. 다시 스크롤하면 어댑터가 디버그 창에서 제대로 굵게 표시하거나 펼치지 않지만 모두 앱에서 대담하게 보입니다.

내가 알아챈 사실 중 하나는 TextView의 속성을 "굵게"로 변경하면 모든 제목 TextViews가 처음부터 굵게 표시되고 변경되지 않는다는 것입니다. textStyle을 제거하거나 시작시 TextViews가 정상인 "normal"로 설정 한 경우에만 해당됩니다.

다음은 ArrayAdapter와에서의 getView()를 다음과 같습니다

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    PostShell shell = postShellList.get(getCount() - 1 - position); //I stack my ListView backwards, so index 0 is at the bottom 
    ViewHolder holder; 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.row_layout, parent, false); 
     holder = new ViewHolder(); 
     holder.firstLine = (TextView) convertView.findViewById(R.id.firstLine); 
     holder.secondLine = (TextView) convertView.findViewById(R.id.secondLine); 
     holder.thirdLine = (TextView) convertView.findViewById(R.id.thirdLine); 
     holder.image = (ImageView) convertView.findViewById(R.id.image); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.firstLine.setText(shell.postTitle); 
    if (shell.unread) { 
     holder.firstLine.setTypeface(holder.firstLine.getTypeface(), Typeface.BOLD); 
    } else { 
     holder.firstLine.setTypeface(holder.firstLine.getTypeface(), Typeface.NORMAL); 
    } 
    //convert other TextViews 
} 

내 ViewHolder 클래스는 몇 TextViews 및 이미지 뷰와 단지 정적 인 클래스입니다. ListView가 특정 위치에있는 요소를 요구하는 경우

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="88dp"> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingLeft="84dp" 
    android:paddingRight="16dp" 
    android:paddingTop="6dp" 
    android:id="@+id/firstLine" 
    android:ellipsize="end" 
    android:text="First" 
    android:textStyle="normal" 
    android:singleLine="true" /> 

<!-- other views --> 

</RelativeLayout> 
+0

복사 및 붙여 넣기의 저주 ... 내 대답 : 0X0nosugar @ – 0X0nosugar

+0

없음 문제를 해결 주셔서 감사합니다, 응답에 대한 감사합니다! :) – weirdo16

답변

1

문제는 "unboldening"텍스트가 다음 문이 작동하지 않는 것 같습니다 :

holder.firstLine.setTypeface (holder.firstLine.getTypeface(), Typeface.NORMAL);

다음 스 니펫은 holder.firstLine.getTypeface()을 제외하고보다 간단한 다양한 setTypeface()을 사용합니다. 나를 위해 일했다.

if (shell.unread) { 
    holder.firstLine.setTypeface(holder.firstLine.getTypeface(), Typeface.BOLD); 
} else { 
    holder.firstLine.setTypeface(Typeface.DEFAULT); 
} 
0
PostShell shell = postShellList.get(getCount() - 1 - position); //I stack my ListView backwards, so index 0 is at the bottom 

, 당신은 더 나은 그것을 줄 것 :

그리고 여기 내가 사용하고 행 레이아웃에 대한 코드의 관련 부분 그 위치에 요소가 있거나 혼란 스러울 것입니다. 목록의 항목 순서를 변경하려면 목록의 순서를 변경하고 ListView을 속여 다른 순서로 렌더링하지 마십시오.

관련 문제