android listview display all available items without scroll with static header

前端 未结 12 525
一生所求
一生所求 2020-12-02 10:12

I\'m having a little difficulties while trying to get a certain layout to work: I want to have list. List does not have to be scrollable, but should be shown completely. But

相关标签:
12条回答
  • 2020-12-02 10:25

    If someone still has the problem then you can make customList and add onMesure() method just like I implemented it:

    public class ScrolleDisabledListView extends ListView {
    
    private int mPosition;
    
    public ScrolleDisabledListView(Context context) {
        super(context);
    }
    
    public ScrolleDisabledListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
    public ScrolleDisabledListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        final int actionMasked = ev.getActionMasked() & MotionEvent.ACTION_MASK;
    
        if (actionMasked == MotionEvent.ACTION_DOWN) {
            // Record the position the list the touch landed on
            mPosition = pointToPosition((int) ev.getX(), (int) ev.getY());
            return super.dispatchTouchEvent(ev);
        }
    
        if (actionMasked == MotionEvent.ACTION_MOVE) {
            // Ignore move events
            return true;
        }
    
        if (actionMasked == MotionEvent.ACTION_UP) {
            // Check if we are still within the same view
            if (pointToPosition((int) ev.getX(), (int) ev.getY()) == mPosition) {
                super.dispatchTouchEvent(ev);
            } else {
                // Clear pressed state, cancel the action
                setPressed(false);
                invalidate();
                return true;
            }
        }
    
        return super.dispatchTouchEvent(ev);
    }
    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
    }
    
    0 讨论(0)
  • 2020-12-02 10:30

    You can make your own customlistview. (It can extends ListView/ExpandableListView/GridView) and override the onMeasure method with this. With this you'll never need to call a function or anything. Just use it in your xml.

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
    
    0 讨论(0)
  • 2020-12-02 10:31

    As @Alex noted in the accepted answer that LinearLayout is hardly a replacement. I had a problem where LinearLayout was not an option, that's when i came across this blog. I will put the code here for reference purposes. Hope it helps someone out there!

    public class UIUtils {
    
        /**
         * Sets ListView height dynamically based on the height of the items.
         *
         * @param listView to be resized
         * @return true if the listView is successfully resized, false otherwise
         */
        public static boolean setListViewHeightBasedOnItems(ListView listView) {
    
            ListAdapter listAdapter = listView.getAdapter();
            if (listAdapter != null) {
    
                int numberOfItems = listAdapter.getCount();
    
                // Get total height of all items.
                int totalItemsHeight = 0;
                for (int itemPos = 0; itemPos < numberOfItems; itemPos++) {
                    View item = listAdapter.getView(itemPos, null, listView);
                    item.measure(0, 0);
                    totalItemsHeight += item.getMeasuredHeight();
                }
    
                // Get total height of all item dividers.
                int totalDividersHeight = listView.getDividerHeight() *
                        (numberOfItems - 1);
    
                // Set list height.
                ViewGroup.LayoutParams params = listView.getLayoutParams();
                params.height = totalItemsHeight + totalDividersHeight;
                listView.setLayoutParams(params);
                listView.requestLayout();
    
                return true;
    
            } else {
                return false;
            }
    
        }
    }
    

    Usage:

    //initializing the adapter
    listView.setAdapter(adapter);
    UIUtils.setListViewHeightBasedOnItems(listView);
    
    //whenever the data changes
    adapter.notifyDataSetChanged();
    UIUtils.setListViewHeightBasedOnItems(listView);
    
    0 讨论(0)
  • 2020-12-02 10:31

    If you want a simple solution to this problem without extending ListView class, this is a solution for you.

     mListView.post(new Runnable() {
            @Override
            public void run() {
                int height = 0;
                for(int i = 0; i < mListView.getChildCount();i++)
                    height += mListView.getChildAt(i).getHeight();
                ViewGroup.LayoutParams lParams = mListView.getLayoutParams();
                lParams.height = height;
                mListView.setLayoutParams(lParams);
            }
        });
    
    0 讨论(0)
  • 2020-12-02 10:31

    I don't have a static header, but using HussoM's post as a clue, here is what I was able to get to work. In my scenario, the height of the items in the list was non-uniform, due to variable text sentences in each of the items, and I am using wrap_content for the height and match_parent for the width.

    public class NonScrollableListView extends ListView {
    
      public NonScrollableListView(Context context) {
          super(context);
      }
    
      public NonScrollableListView(Context context, AttributeSet attrs) {
          super(context, attrs);
      }
    
      public NonScrollableListView(Context context, AttributeSet attrs, int defStyleAttr) {
          super(context, attrs, defStyleAttr);
      }
    
      public NonScrollableListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
          super(context, attrs, defStyleAttr, defStyleRes);
      }
    
      /**
       * Measure the height of all the items in the list and set that to be the height of this
       * view, so it appears as full size and doesn't need to scroll.
       * @param widthMeasureSpec
       * @param heightMeasureSpec
       */
      @Override
      public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
          ListAdapter adapter = this.getAdapter();
          if (adapter == null) {
              // we don't have an adapter yet, so probably initializing.
              super.onMeasure(widthMeasureSpec, heightMeasureSpec);
              return;
          }
    
          int totalHeight = 0;
    
          // compute the height of all the items
          int itemCount = adapter.getCount();
          for (int index=0; index<itemCount; index++) {
              View item = adapter.getView(index, null, this);
              // set the width so it can figure out the height
              item.measure(widthMeasureSpec, 0);
              totalHeight += item.getMeasuredHeight();
          }
    
          // add any dividers to the height
          if (this.getDividerHeight() > 0) {
              totalHeight += this.getDividerHeight() * Math.max(0, itemCount - 1);
          }
    
          // make it so
          this.setMeasuredDimension(widthMeasureSpec,
                  MeasureSpec.makeMeasureSpec(totalHeight, MeasureSpec.EXACTLY));
      }
    

    }

    0 讨论(0)
  • 2020-12-02 10:33

    Check this out:

    ListView ignoring wrap_content

    Using android:layout_height and android:layout_weight solved it for me:

    <ListView
        android:layout_height="0dp"
        android:layout_weight="1"
        />
    
    0 讨论(0)
提交回复
热议问题