Niedawno napotkano problem, w którym animacja o nieokreślonym numerze ProgressBar
użyta wewnątrz wiersza ListView
stała się niestabilna. Krótko mówiąc, mam ListView
, gdzie każdy wiersz zawiera ProgressBar
. Animacje wyglądają świetnie, dopóki nie przewijam; od tego momentu co najmniej jeden z ProgressBar
będzie miał animację przerywaną.Wydajność z posuwistym przebiegiem w przypadku użycia w ListView
Czy ktoś wie, jak rozwiązać ten problem?
widoku dla rzędu ListView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
android:indeterminate="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
prosty zwyczaj ArrayAdapter
public class MyAdapter extends ArrayAdapter {
List list;
public MyAdapter(Context context, List objects) {
super(context, 0, objects);
list = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = ((LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.list_row, parent, false);
}
return convertView;
}
}
OnCreate() sposobu aktywność próbki
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
ListView listView = (ListView)findViewById(R.id.list_view);
ArrayList<Integer> data = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5,6,7,8,9,0,11,12,13,14,15,16,17));
MyAdapter adapter = new MyAdapter(this, data);
listView.setAdapter(adapter);
}
Bug logged (zawiera przykładowy projekt): https://code.google.com/p/android/issues/detail?id=145569&thanks=145569&ts=1423673226
W tym przypadku nie sądzę wzór widok posiadacz pomoże. Zazwyczaj wzorzec uchwytu widoku jest używany do zmniejszenia liczby wywołań 'findViewById', co może negatywnie wpłynąć na wydajność (zazwyczaj w przypadku przewijania listy). W tym przykładzie nigdy nie nazywam 'findViewById', więc użycie wzorca widoku nie wygląda na to, że rozwiąże problem. –
@Eric Farraro masz rację. Ale jestem ciekawy, czy RecyclerView zachowuje się tak samo. Czy przetestowałeś go za pomocą LinearLayoutManager? – cybergen
@cybergen, po twojej sugestii, spróbowałem również prostego RecyclerView/LinearLayoutManager. Wygląda na to, że działa znacznie lepiej i nie zaobserwowałem tego samego błędu w animacji. Wygląda na to, że błąd może w szczególności dotyczyć animacji ListView/ProgressBar. –