package com.micabytes.gui; import android.annotation.TargetApi; import android.content.Context; import android.database.DataSetObserver; import android.os.Build; import android.util.AttributeSet; import android.view.View; import android.widget.Adapter; import android.widget.LinearLayout; import java.util.ArrayList; import java.util.Iterator; import java.util.List; // android:orientation @SuppressWarnings("ClassUnconnectedToPackage") public class LinearListView extends LinearLayout { private Adapter adapter; @SuppressWarnings("ThisEscapedInObjectConstruction") private final Observer observer = new Observer(this); public LinearListView(Context context) { super(context); } public LinearListView(Context context, AttributeSet attrs) { super(context, attrs); } @TargetApi(Build.VERSION_CODES.HONEYCOMB) public LinearListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setAdapter(Adapter adp) { if (adapter != null) { adapter.unregisterDataSetObserver(observer); } adapter = adp; adp.registerDataSetObserver(observer); observer.onChanged(); } Adapter getAdapter() { return adapter; } private static final class Observer extends DataSetObserver { final LinearListView listView; private Observer(LinearListView lw) { listView = lw; } @SuppressWarnings("MethodWithMultipleLoops") @Override public void onChanged() { List<View> oldViews = new ArrayList<>(listView.getChildCount()); for (int i = 0; i < listView.getChildCount(); i++) oldViews.add(listView.getChildAt(i)); Iterator<View> itr = oldViews.iterator(); listView.removeAllViews(); for (int i = 0; i < listView.getAdapter().getCount(); i++) { View convertView = itr.hasNext() ? itr.next() : null; listView.addView(listView.getAdapter().getView(i, convertView, listView)); } super.onChanged(); } @Override public void onInvalidated() { listView.removeAllViews(); super.onInvalidated(); } } }