Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Link spans are lost from ListView's convertView

Why links in ListView are lost, when scrolling? From debugging it's clear, that spans are not added second time on a TextView from the convertView.

Here's a piece of code which is called from adapter's getView.

    ...
    String body = MyItemDetails.getBody(); // String to linkify

    final Spannable spannable = MyCustomUri.addHashtagSpans(context, body);
    viewHolder.textView.setText(spannable);

    viewHolder.textView.setTextIsSelectable(true); // adds additional spans
    viewHolder.textView.setMovementMethod(ArrowKeyMovementMethod.getInstance());
    viewHolder.textView.setAutoLinkMask(Linkify.WEB_URLS);
    ...

MyCustomUri.addHashtagSpans() creates a SpannableString with MyCustomSpan with extends URLSpan.

Problem is that when I scroll up and down in the ListView links are lost. Whereas when screen is opened 1st time it's set correctly.

Now I made a dirty fix by disabling reuse of convertView :( Any ideas how to solve this problem better?

like image 854
ViliusK Avatar asked Oct 01 '22 20:10

ViliusK


1 Answers

Some of the spannable information is likely being lost when the textview's data is written to a parcel for retention.

See TextView.onSaveInstanceState(), TextView.onRestoreInstanceState(), and TextView.SavedState.

It can often be very frustrating to determine what android will and will not retain. I often just setSaveEnabled(false) on my views to disable the unpredictable default behaviours of the base widgets.

Also, the viewholder pattern is only really intended for retaining view/layout instance hierarchies. To save you from having to inflate or find your views every getView(). It's always your responsibility to update a view's data when presenting it from getView().

You don't need to completely disable the viewholder pattern, instead just simply update the text every getView(), as you may already be doing.

like image 167
Kyle Ivey Avatar answered Oct 10 '22 16:10

Kyle Ivey