is it possible to set adapter to linear layout?

前端 未结 2 1929
面向向阳花
面向向阳花 2021-02-01 17:10

Is it possible to set adapter to a LinearLayout?

I don\'t want to use ListView since I am using ScrollView. so I am using Li

相关标签:
2条回答
  • 2021-02-01 17:38

    Yes you can by adding your own specific LinearLayout implementation to get child views from the adapter. However, my basic implementation will not provide all the view recycling code provided by the list view.

    /**
     * A linear layout that will contain views taken from an adapter. It differs
     * from the list view in the fact that it will not optimize anything and
     * draw all the views from the adapter. It also does not provide scrolling.
     * However, when you need a layout that will render views horizontally and
     * you know there are not many child views, this is a good option.
    
     *
     * @author Vincent Mimoun-Prat @ MarvinLabs
     */
    public class AdapterLinearLayout extends LinearLayout {
    
        private Adapter adapter;
        private DataSetObserver dataSetObserver = new DataSetObserver() {
            @Override
            public void onChanged() {
                super.onChanged();
                reloadChildViews();
            }
        };
    
        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        public AdapterLinearLayout(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            setOrientation(LinearLayout.HORIZONTAL);
        }
    
        public AdapterLinearLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
            setOrientation(LinearLayout.HORIZONTAL);
        }
    
        public AdapterLinearLayout(Context context) {
            super(context);
            setOrientation(LinearLayout.HORIZONTAL);
        }
    
        public void setAdapter(Adapter adapter) {
            if (this.adapter == adapter) return;
            this.adapter = adapter;
            if (adapter != null) adapter.registerDataSetObserver(dataSetObserver);
            reloadChildViews();
        }
    
        @Override
        protected void onDetachedFromWindow() {
            super.onDetachedFromWindow();
            if (adapter != null) adapter.unregisterDataSetObserver(dataSetObserver);
        }
    
        private void reloadChildViews() {
            removeAllViews();
    
            if (adapter == null) return;
    
            int count = adapter.getCount();
            for (int position = 0; position < count; ++position) {
                View v = adapter.getView(position, null, this);
                if (v != null) addView(v);
            }
    
            requestLayout();
        }
    }
    
    0 讨论(0)
  • 2021-02-01 17:51

    no you can't. What you can do is inflate the single row, and adding to the LinearLayout. In pseudo code:

      LinearLayout linearLayout = (LinearLayout) findViewById(...);
      LayoutInflater inflater = LayoutInflater.from(this);
      for (item in arrayList) {
         View view  = inflater.inflate(R.layout.row, linearLayout, false); 
         // set item content in view
         linearLayout.addView(view)
      }
    
    0 讨论(0)
提交回复
热议问题