1

對於ListView,我有一個自定義ArrayAdapter,它使用自定義行佈局,這是在XML中單獨定義的。佈局只是三個TextViews和一個ImageView,放在一起RelativeLayout。爲了提高性能,適配器使用一個像描述here的ViewHolder系統來轉換現有視圖,而不是膨脹新視圖。在ArrayAdapter.getView()中,根據布爾值,適配器應該加粗或取消打磨第一個TextView。Android ArrayAdapter未正確轉換Views

當我第一次打開該應用程序時,所有的TextView都以正確的粗體顯示或取消打開。但是,如果我滾動到ListView的底部,然後回滾到頂部,所有標題TextView都是粗體,即使它們不應該是。我認爲這與轉換已經大膽的現有視圖有關,但我無法弄清楚它是什麼。我已經使用Android Studio調試了應用程序,並且它運行的方式與我認爲的一樣 - 當我向後滾動時,適配器在調試窗口中正確地粗體/展開了一些東西,但它們在應用程序中似乎都很大膽。

我注意到的一件事是,如果我將TextView的textStyle屬性更改爲「粗體」,則所有標題TextViews都從一開始就是粗體,並且永遠不會更改。只有當我刪除textStyle或將其設置爲「正常」時,TextView纔是正常的。

這裏的getView()在一個ArrayAdapter:

@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和ImageView的靜態類。

而這裏的代碼對我使用該行佈局的相關部分:

<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

+0

@ 0X0nosugar沒問題,謝謝你的回答! :) – 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在特定職位要求的元素,你最好給它元素在那個位置或者它會被混淆。如果你想改變列表中的項目順序,改變列表的順序,不要試圖誘騙ListView以不同的順序渲染它。