У меня есть пользовательский ArrayAdapter
для ListView
, который использует собственный макет строки, определенный отдельно в XML. План состоит всего из трех TextViews
и ImageView
, собранных в RelativeLayout
. Чтобы повысить производительность, адаптер использует систему ViewHolder, такую как описанная here, для преобразования существующих представлений вместо надувания новых. В ArrayAdapter.getView()
адаптер должен выделять или откручивать первый TextView, в зависимости от логического.Android ArrayAdapter неправильно преобразовывает представления
Когда я впервые открываю приложение, все текстовые элементы будут выделены полужирным шрифтом или разблокированы. Однако, если я прокручиваю нижнюю часть ListView, а затем прокручиваю назад, все заголовки TextViews выделены жирным шрифтом, даже если они не должны быть. Я думаю, что это должно быть связано с преобразованием существующих представлений, которые уже выделены жирным шрифтом, но я не могу понять, что это такое. Я отлаживал приложение с помощью Android Studio, и он работает так же, как я думаю, он должен - когда я прокручиваю резервную копию, адаптер должным образом выделяет/снимает содержимое в окне отладки, но все они кажутся живыми в приложении.
Одна вещь, которую я заметил, заключается в том, что если я изменил атрибут TextView на текст «полужирным шрифтом», все заголовки TextView будут выделены жирным шрифтом с самого начала и никогда не будут меняться. Это только если я удаляю textStyle
или устанавливаю его в "normal", что TextViews являются нормальными в начале.
Вот 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