android: listview in listview

前端 未结 5 1323
栀梦
栀梦 2020-11-28 06:31

i\'m trying to place a listview inside a listviewitem. the inner listview should not be scrollable but take all size it needs to display all it\'s rows. is there a better wa

5条回答
  •  一向
    一向 (楼主)
    2020-11-28 07:04

    Maybe somebody will find my solution useful. It is based on @ChrLipp answer and uses LinearLayout.

    public class NotScrollableListView extends LinearLayout {
    
    private ListAdapter adapter;
    private DataChangeObserver dataChangeObserver;
    private Drawable divider;
    private int dividerHeight;
    
    private List reusableViews = new ArrayList<>();
    
    public NotScrollableListView(Context context) {
        super(context);
    }
    
    public NotScrollableListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    
        setAttributes(attrs);
    }
    
    public NotScrollableListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    
        setAttributes(attrs);
    }
    
    public ListAdapter getAdapter() {
        return adapter;
    }
    
    public void setAdapter(ListAdapter adapter) {
        if (this.adapter != null && dataChangeObserver != null) {
            this.adapter.unregisterDataSetObserver(dataChangeObserver);
        }
    
        this.adapter = adapter;
    }
    
    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
    
        if (adapter != null) {
            dataChangeObserver = new DataChangeObserver();
            adapter.registerDataSetObserver(dataChangeObserver);
    
            fillContents();
        }
    }
    
    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
    
        if (adapter != null) {
            adapter.unregisterDataSetObserver(dataChangeObserver);
            dataChangeObserver = null;
        }
    }
    
    private void fillContents() {
    
        // clearing contents
        this.removeAllViews();
    
        final int count = adapter.getCount();   // item count
        final int reusableCount = reusableViews.size(); // count of cached reusable views
    
        // calculating of divider properties
        ViewGroup.LayoutParams dividerLayoutParams = null;
        if (divider != null && dividerHeight > 0) {
            dividerLayoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dividerHeight);
        }
    
        // adding items
        for (int i = 0; i < count; i++) {
            // adding item
            View converView = null;
            if (i < reusableCount) {    // we have cached view
                converView = reusableViews.get(i);
            }
            View view = adapter.getView(i, converView, this);
    
            if (i >= reusableCount) {   // caching view
                reusableViews.add(view);
            }
    
            addView(view);
    
            // adding divider
            if (divider != null && dividerHeight > 0) {
                if (i < count - 1) {
                    ImageView dividerView = new ImageView(getContext());
                    dividerView.setImageDrawable(divider);
                    dividerView.setLayoutParams(dividerLayoutParams);
                    addView(dividerView);
                }
            }
        }
    }
    
    private void setAttributes(AttributeSet attributes) {
        int[] dividerAttrs = new int[]{android.R.attr.divider, android.R.attr.dividerHeight};
    
        TypedArray a = getContext().obtainStyledAttributes(attributes, dividerAttrs);
        try {
            divider = a.getDrawable(0);
            dividerHeight = a.getDimensionPixelSize(1, 0);
        } finally {
            a.recycle();
        }
    
        setOrientation(VERTICAL);
    }
    
    private class DataChangeObserver extends DataSetObserver {
        @Override
        public void onChanged() {
            super.onChanged();
    
            fillContents();
        }
    
        @Override
        public void onInvalidated() {
            super.onInvalidated();
    
            fillContents();
        }
    }
        }
    
        
    

提交回复
热议问题