對於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>
複製和粘貼的詛咒...感謝您修復我的答案:) – 0X0nosugar
@ 0X0nosugar沒問題,謝謝你的回答! :) – weirdo16