1

У меня есть пользовательский 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> 
+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 в рендеринг его в другом порядке.