Пример #1
0
  private void measureScrapChild(View child, int position, int widthMeasureSpec) {
    ListView.LayoutParams p = (ListView.LayoutParams) child.getLayoutParams();
    if (p == null) {
      p =
          new ListView.LayoutParams(
              ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0);
      child.setLayoutParams(p);
    }
    // XXX p.viewType = mAdapter.getItemViewType(position);
    // XXX p.forceAdd = true;

    int childWidthSpec =
        ViewGroup.getChildMeasureSpec(
            widthMeasureSpec,
            mDropDownList.getPaddingLeft() + mDropDownList.getPaddingRight(),
            p.width);
    int lpHeight = p.height;
    int childHeightSpec;
    if (lpHeight > 0) {
      childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY);
    } else {
      childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
    }
    child.measure(childWidthSpec, childHeightSpec);
  }
Пример #2
0
 public void clearListSelection() {
   final DropDownListView list = mDropDownList;
   if (list != null) {
     // WARNING: Please read the comment where mListSelectionHidden is declared
     list.mListSelectionHidden = true;
     // XXX list.hideSelector();
     list.requestLayout();
   }
 }
Пример #3
0
 /**
  * Set the selected position of the list. Only valid when {@link #isShowing()} == {@code true}.
  *
  * @param position List position to set as selected.
  */
 public void setSelection(int position) {
   DropDownListView list = mDropDownList;
   if (isShowing() && list != null) {
     list.mListSelectionHidden = false;
     list.setSelection(position);
     if (list.getChoiceMode() != ListView.CHOICE_MODE_NONE) {
       list.setItemChecked(position, true);
     }
   }
 }
  public MyPopupWindow(Context context) {
    super(context);
    mContext = context;
    listView = new DropDownListView(context);
    setContentView(listView);
    setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
    setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
    mAdapter =
        new ArrayAdapter<String>(
            context, android.R.layout.simple_list_item_1, new ArrayList<String>());
    listView.setAdapter(mAdapter);
    listView.setOnItemClickListener(
        new OnItemClickListener() {

          @Override
          public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String text = (String) listView.getItemAtPosition(position);
            Toast.makeText(mContext, text, Toast.LENGTH_SHORT).show();
          }
        });

    mAdapter.add("item1");
    mAdapter.add("item2");
  }
Пример #5
0
  public void setAdapter(ListAdapter adapter) {
    if (mObserver == null) {
      mObserver = new PopupDataSetObserver();
    } else if (mAdapter != null) {
      mAdapter.unregisterDataSetObserver(mObserver);
    }
    mAdapter = adapter;
    if (mAdapter != null) {
      adapter.registerDataSetObserver(mObserver);
    }

    if (mDropDownList != null) {
      mDropDownList.setAdapter(mAdapter);
    }
  }
Пример #6
0
  private int measureHeightOfChildren(
      int widthMeasureSpec,
      int startPosition,
      int endPosition,
      final int maxHeight,
      int disallowPartialChildPosition) {

    final ListAdapter adapter = mAdapter;
    if (adapter == null) {
      return mDropDownList.getListPaddingTop() + mDropDownList.getListPaddingBottom();
    }

    // Include the padding of the list
    int returnedHeight = mDropDownList.getListPaddingTop() + mDropDownList.getListPaddingBottom();
    final int dividerHeight =
        ((mDropDownList.getDividerHeight() > 0) && mDropDownList.getDivider() != null)
            ? mDropDownList.getDividerHeight()
            : 0;
    // The previous height value that was less than maxHeight and contained
    // no partial children
    int prevHeightWithoutPartialChild = 0;
    int i;
    View child;

    // mItemCount - 1 since endPosition parameter is inclusive
    endPosition = (endPosition == -1 /*NO_POSITION*/) ? adapter.getCount() - 1 : endPosition;

    for (i = startPosition; i <= endPosition; ++i) {
      child = mAdapter.getView(i, null, mDropDownList);
      if (mDropDownList.getCacheColorHint() != 0) {
        child.setDrawingCacheBackgroundColor(mDropDownList.getCacheColorHint());
      }

      measureScrapChild(child, i, widthMeasureSpec);

      if (i > 0) {
        // Count the divider for all but one child
        returnedHeight += dividerHeight;
      }

      returnedHeight += child.getMeasuredHeight();

      if (returnedHeight >= maxHeight) {
        // We went over, figure out which height to return.  If returnedHeight > maxHeight,
        // then the i'th position did not fit completely.
        return (disallowPartialChildPosition >= 0) // Disallowing is enabled (> -1)
                && (i > disallowPartialChildPosition) // We've past the min pos
                && (prevHeightWithoutPartialChild > 0) // We have a prev height
                && (returnedHeight != maxHeight) // i'th child did not fit completely
            ? prevHeightWithoutPartialChild
            : maxHeight;
      }

      if ((disallowPartialChildPosition >= 0) && (i >= disallowPartialChildPosition)) {
        prevHeightWithoutPartialChild = returnedHeight;
      }
    }

    // At this point, we went through the range of children, and they each
    // completely fit, so return the returnedHeight
    return returnedHeight;
  }
Пример #7
0
  private int buildDropDown() {
    ViewGroup dropDownView;
    int otherHeights = 0;

    if (mDropDownList == null) {
      Context context = mContext;

      mDropDownList = new DropDownListView(context, !mModal);
      if (mDropDownListHighlight != null) {
        mDropDownList.setSelector(mDropDownListHighlight);
      }
      mDropDownList.setAdapter(mAdapter);
      mDropDownList.setOnItemClickListener(mItemClickListener);
      mDropDownList.setFocusable(true);
      mDropDownList.setFocusableInTouchMode(true);
      mDropDownList.setOnItemSelectedListener(
          new AdapterView.OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

              if (position != -1) {
                DropDownListView dropDownList = mDropDownList;

                if (dropDownList != null) {
                  dropDownList.mListSelectionHidden = false;
                }
              }
            }

            public void onNothingSelected(AdapterView<?> parent) {}
          });
      mDropDownList.setOnScrollListener(mScrollListener);

      if (mItemSelectedListener != null) {
        mDropDownList.setOnItemSelectedListener(mItemSelectedListener);
      }

      dropDownView = mDropDownList;

      View hintView = mPromptView;
      if (hintView != null) {
        // if an hint has been specified, we accomodate more space for it and
        // add a text view in the drop down menu, at the bottom of the list
        LinearLayout hintContainer = new LinearLayout(context);
        hintContainer.setOrientation(LinearLayout.VERTICAL);

        LinearLayout.LayoutParams hintParams =
            new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1.0f);

        switch (mPromptPosition) {
          case POSITION_PROMPT_BELOW:
            hintContainer.addView(dropDownView, hintParams);
            hintContainer.addView(hintView);
            break;

          case POSITION_PROMPT_ABOVE:
            hintContainer.addView(hintView);
            hintContainer.addView(dropDownView, hintParams);
            break;

          default:
            break;
        }

        // measure the hint's height to find how much more vertical space
        // we need to add to the drop down's height
        int widthSpec = MeasureSpec.makeMeasureSpec(mDropDownWidth, MeasureSpec.AT_MOST);
        int heightSpec = MeasureSpec.UNSPECIFIED;
        hintView.measure(widthSpec, heightSpec);

        hintParams = (LinearLayout.LayoutParams) hintView.getLayoutParams();
        otherHeights =
            hintView.getMeasuredHeight() + hintParams.topMargin + hintParams.bottomMargin;

        dropDownView = hintContainer;
      }

      mPopup.setContentView(dropDownView);
    } else {
      dropDownView = (ViewGroup) mPopup.getContentView();
      final View view = mPromptView;
      if (view != null) {
        LinearLayout.LayoutParams hintParams = (LinearLayout.LayoutParams) view.getLayoutParams();
        otherHeights = view.getMeasuredHeight() + hintParams.topMargin + hintParams.bottomMargin;
      }
    }

    // getMaxAvailableHeight() subtracts the padding, so we put it back
    // to get the available height for the whole window
    int padding = 0;
    Drawable background = mPopup.getBackground();
    if (background != null) {
      background.getPadding(mTempRect);
      padding = mTempRect.top + mTempRect.bottom;

      // If we don't have an explicit vertical offset, determine one from the window
      // background so that content will line up.
      if (!mDropDownVerticalOffsetSet) {
        mDropDownVerticalOffset = -mTempRect.top;
      }
    }

    // Max height available on the screen for a popup.
    boolean ignoreBottomDecorations =
        mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED;
    final int maxHeight = /*mPopup.*/
        getMaxAvailableHeight(
            mDropDownAnchorView, mDropDownVerticalOffset, ignoreBottomDecorations);

    if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) {
      return maxHeight + padding;
    }

    final int listContent = /*mDropDownList.*/
        measureHeightOfChildren(
            MeasureSpec.UNSPECIFIED, 0, -1 /*ListView.NO_POSITION*/, maxHeight - otherHeights, -1);
    // add padding only if the list has items in it, that way we don't show
    // the popup if it is not needed
    if (listContent > 0) otherHeights += padding;

    return listContent + otherHeights;
  }
Пример #8
0
  public void show() {
    int height = buildDropDown();

    int widthSpec = 0;
    int heightSpec = 0;

    boolean noInputMethod = isInputMethodNotNeeded();
    // XXX mPopup.setAllowScrollingAnchorParent(!noInputMethod);

    if (mPopup.isShowing()) {
      if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) {
        // The call to PopupWindow's update method below can accept -1 for any
        // value you do not want to update.
        widthSpec = -1;
      } else if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) {
        widthSpec = mDropDownAnchorView.getWidth();
      } else {
        widthSpec = mDropDownWidth;
      }

      if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) {
        // The call to PopupWindow's update method below can accept -1 for any
        // value you do not want to update.
        heightSpec = noInputMethod ? height : ViewGroup.LayoutParams.MATCH_PARENT;
        if (noInputMethod) {
          mPopup.setWindowLayoutMode(
              mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT
                  ? ViewGroup.LayoutParams.MATCH_PARENT
                  : 0,
              0);
        } else {
          mPopup.setWindowLayoutMode(
              mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT
                  ? ViewGroup.LayoutParams.MATCH_PARENT
                  : 0,
              ViewGroup.LayoutParams.MATCH_PARENT);
        }
      } else if (mDropDownHeight == ViewGroup.LayoutParams.WRAP_CONTENT) {
        heightSpec = height;
      } else {
        heightSpec = mDropDownHeight;
      }

      mPopup.setOutsideTouchable(true);

      mPopup.update(
          mDropDownAnchorView,
          mDropDownHorizontalOffset,
          mDropDownVerticalOffset,
          widthSpec,
          heightSpec);
    } else {
      if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) {
        widthSpec = ViewGroup.LayoutParams.MATCH_PARENT;
      } else {
        if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) {
          mPopup.setWidth(mDropDownAnchorView.getWidth());
        } else {
          mPopup.setWidth(mDropDownWidth);
        }
      }

      if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) {
        heightSpec = ViewGroup.LayoutParams.MATCH_PARENT;
      } else {
        if (mDropDownHeight == ViewGroup.LayoutParams.WRAP_CONTENT) {
          mPopup.setHeight(height);
        } else {
          mPopup.setHeight(mDropDownHeight);
        }
      }

      mPopup.setWindowLayoutMode(widthSpec, heightSpec);
      // XXX mPopup.setClipToScreenEnabled(true);

      // use outside touchable to dismiss drop down when touching outside of it, so
      // only set this if the dropdown is not always visible
      mPopup.setOutsideTouchable(true);
      mPopup.setTouchInterceptor(mTouchInterceptor);
      mPopup.showAsDropDown(
          mDropDownAnchorView, mDropDownHorizontalOffset, mDropDownVerticalOffset);
      mDropDownList.setSelection(ListView.INVALID_POSITION);

      if (!mModal || mDropDownList.isInTouchMode()) {
        clearListSelection();
      }
      if (!mModal) {
        mHandler.post(mHideSelector);
      }
    }
  }