2014-02-22 2 views
1

최대 높이를 가질 나는 팝업이처럼 행동 할 : 높이가 < X 가 나는 PopupWindow 내부 목록보기 팽창

    • 리스트 뷰를 감싸 설정 팝업의 높이 = x listview의 높이가 x보다 큰 경우 (리스트 뷰가 스크롤 가능)

    EditText에 첨부 된 TextWatcher가 검색 제안을 표시하기 때문에 팝업이 표시됩니다. ListView의 기본 어댑터는 사용자가 EditText에 내용을 입력 할 때마다 시작되는 사용자 지정 로더에 의해 관리됩니다. 리스트 뷰에서 onMeasure()을 재정의하고 측정 된 높이를 PopupWindow.update()을 호출하는 수신기로 전달하려고 시도했지만 후자가 첫 번째 호출을 끝내기 때문에 루프가 생성됩니다. 다음 코드를 사용하면 팝업은 포함 된 ListView를 원하는대로 래핑하지만 높이는 어떤 값으로도 제한되지 않습니다. 300dp라고 가정 해 봅시다. 높이를 최대 값으로 제한하는 솔루션이 필요합니다.

    etFiltro.addTextChangedListener(new TextWatcher() { 
         @Override 
         public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { 
          /... 
         } 
         @Override 
         public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { 
          Log.i("loader","text changed"); 
          filtro = String.valueOf(charSequence); 
          getSupportLoaderManager().restartLoader(0,null,loaderCallbacks); 
          if (popupWindow.isShowing()) popupWindow.dismiss(); 
         } 
         @Override 
         public void afterTextChanged(Editable editable) {    
          popupWindow.showAsDropDown(etFiltro); 
         } 
        }); 
    
    private LoaderManager.LoaderCallbacks<Cursor> loaderCallbacks = new LoaderManager.LoaderCallbacks<Cursor>() { 
    
        MyListView suggestionList; 
        SimpleCursorAdapter adapter; 
        int mHeight; 
    
        @Override 
        public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { 
         SuggestionLoader loader = new SuggestionLoader(MainActivity.this, databaseConnector, filtro); 
         loader.setUpdateThrottle(500); 
         View view = ((LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE)).inflate(R.layout.popup_window,null); 
         suggestionList = (MyListView) view.findViewById(R.id.suggestionList); 
         adapter = new SimpleCursorAdapter(MainActivity.this,android.R.layout.simple_list_item_1,null, 
           new String[]{"note"},new int[]{android.R.id.text1},0); 
         suggestionList.setAdapter(adapter); 
         suggestionList.setEmptyView(view.findViewById(R.id.tvNoSuggestions)); 
         //ensure previous popup is dismissed 
         if (popupWindow!=null) popupWindow.dismiss(); 
         popupWindow = new PopupWindow(view,etFiltro.getWidth(),0); 
         popupWindow.setWindowLayoutMode(0,WindowManager.LayoutParams.WRAP_CONTENT); 
         popupWindow.setAnimationStyle(0);//0 = no animation; -1 = default animation    
         Log.i("loader","onCreateLoader"); 
         return loader; 
        } 
    
        @Override 
        public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { 
         adapter.changeCursor(cursor);   
         Log.i("loader","onLoadFinished"); 
    
        } 
    
        @Override 
        public void onLoaderReset(Loader<Cursor> cursorLoader) { 
         Log.i("loader", "onLoaderReset"); 
         adapter.changeCursor(null); 
        } 
    }; 
    
  • 답변

    2

    나는 해결책을 스스로 찾았습니다. 이 문제에 비틀 거릴 사람은 누구나 ListView 메서드 onMeasure()을 다음과 같이 재정의하는 것입니다.