Android set View.GONE does not “release” space in listview

前端 未结 7 636
[愿得一人]
[愿得一人] 2021-01-18 11:01

I have a listview with some items that can be marked as \"done\". There is also a togglebutton that says \"hide done items\".

However, when I do hide the items by s

7条回答
  •  误落风尘
    2021-01-18 11:29

    After checking many solutions none of which was solved my issue with the empty space so I decided to came up with my solution.

    I had two main issues: 1) I had an empty space because of the view that I set its visibility to gone 2) I had also dividerHeight of 12dp, even if I had the first issue solved I still had the fixed divider height of the listview

    Solution:

    1.1) I added a boolean to the data of the list, to notify the adapter which of the items are skipped

    1.2) I created an empty layout to simulate an "skipped item"

    
    
    

    1.3) I have several types of views in my listview, selected item, regular item and now skipped item

        public class AdvancedTestAdapter extends BaseAdapter
    {
    
        private static final int        REGULAR_STEP    = 0;
        private static final int        SELECTED_STEP   = 1;
        private static final int        SKIPPED_STEP    = 2;
    
        private static final int        TYPE_MAX_COUNT  = 3;
    
    
        private List  _data;
        private Context                 _context;
        private Typeface                _fontTypeFace;
    
        public AdvancedTestAdapter(Context context, List data)
        {
            _context = context;
            _data = data;
            _fontTypeFace = Typeface.createFromAsset(_context.getResources().getAssets(), Consts.Fonts.UniversLTStdBoldCn);
        }
    
        @Override
        public AdvancedTestData getItem(int position)
        {
            return _data.get(position);
        }
    
        @Override
        public int getCount()
        {
            return _data.size();
        }
    
        @Override
        public long getItemId(int position)
        {
            return 0;
        }
    
        @Override
        public int getItemViewType(int position)
        {
            AdvancedTestData step = getItem(position);
            if(step.isSkipped())
            {
                return SKIPPED_STEP;
            }
            return _data.get(position).isStepSelected() ? SELECTED_STEP : REGULAR_STEP;
        }
    
        @Override
        public int getViewTypeCount()
        {
            return TYPE_MAX_COUNT;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
            RegularViewHolder regHolder;
            SelectedViewHolder selectHolder;
    
            AdvancedTestData item = getItem(position);
            int currentStepType = getItemViewType(position);
    
            switch (currentStepType)
            {
                case SKIPPED_STEP:
                    convertView = LayoutInflater.from(_context).inflate(R.layout.skipped_item_layout, parent, false);
                    break;
                case REGULAR_STEP:
                    if (convertView == null)
                    {
                        regHolder = new RegularViewHolder();
                        convertView = LayoutInflater.from(_context).inflate(R.layout.advanced_test_layout, parent, false);
                        regHolder._regTestUpperHeader = (TextView) convertView.findViewById(R.id.advanced_test_upper_name);
                        regHolder._regTestLowerHeader = (TextView) convertView.findViewById(R.id.advanced_test_lower_name);
                        regHolder._regTestImage = (ImageView) convertView.findViewById(R.id.advanced_test_image);
                        regHolder._regTestWithoutLowerHeader = (TextView) convertView.findViewById(R.id.step_without_lower_header);
    
                        regHolder._regTestUpperHeader.setTypeface(_fontTypeFace);
                        regHolder._regTestLowerHeader.setTypeface(_fontTypeFace);
                        regHolder._regTestWithoutLowerHeader.setTypeface(_fontTypeFace);
    
                        convertView.setTag(regHolder);
                    }
                    else
                    {
                        regHolder = (RegularViewHolder) convertView.getTag();
                    }
    
                    String upperHeader = item.getTestUpperHeader();
                    String lowerHeader = item.getTestLowerHeader();
    
                    if(lowerHeader.isEmpty())
                    {
                        regHolder._regTestUpperHeader.setVisibility(View.GONE);
                        regHolder._regTestLowerHeader.setVisibility(View.GONE);
                        regHolder._regTestWithoutLowerHeader.setVisibility(View.VISIBLE);
                        regHolder._regTestWithoutLowerHeader.setText(upperHeader);
                    }
                    else
                    {
                        regHolder._regTestUpperHeader.setVisibility(View.VISIBLE);
                        regHolder._regTestLowerHeader.setVisibility(View.VISIBLE);
                        regHolder._regTestWithoutLowerHeader.setVisibility(View.GONE);
    
                        regHolder._regTestUpperHeader.setText(upperHeader);
                        regHolder._regTestLowerHeader.setText(lowerHeader);
                    }
    
                    regHolder._regTestImage.setBackgroundResource(item.getResourceId());
                    break;
    
                case SELECTED_STEP:
    
                    if (convertView == null)
                    {
                        selectHolder = new SelectedViewHolder();
                        convertView = LayoutInflater.from(_context).inflate(R.layout.advanced_selected_step_layout, parent, false);
    
                        selectHolder._selectedTestName = (TextView) convertView.findViewById(R.id.selected_header_text);
                        selectHolder._selectedTestDesc = (TextView) convertView.findViewById(R.id.selected_desc_text);
                        selectHolder._selectedPreFinishControllers = (RelativeLayout) convertView.findViewById(R.id.prefinish_step_controllers);
                        selectHolder._selectedFvEndControllers = (RelativeLayout) convertView.findViewById(R.id.advanced_fv_controllers);
                        selectHolder._selectedNvEndControllers = (RelativeLayout) convertView.findViewById(R.id.advanced_nv_controllers);
    
                        convertView.setTag(selectHolder);
                    }
                    else
                    {
                        selectHolder = (SelectedViewHolder) convertView.getTag();
                    }
    
                    selectHolder._selectedPreFinishControllers.setVisibility(View.INVISIBLE);
                    selectHolder._selectedFvEndControllers.setVisibility(View.INVISIBLE);
                    selectHolder._selectedNvEndControllers.setVisibility(View.INVISIBLE);
    
    
                    int testIndex = item.getTestIndex();
                    ADVANCED_QUICK_TEST_TESPS currentStep = ADVANCED_QUICK_TEST_TESPS.valueOf(testIndex);
    
                    //show action buttons in each step in advanced mode
                    switch (currentStep)
                    {
                        case QUESTIONS://nothing to show
                            break;
                        case RIGHT_VERIFICATION:
                        case LEFT_VERIFICATION:
                        case BINOCULAR_BALANCE:
                        case SPHERE_VERIFICATION:
                        case ADD_VERIFICATION:
                            if(item.isStepPreFinished())
                            {
                                selectHolder._selectedPreFinishControllers.setVisibility(View.VISIBLE);
                            }
    
                            break;
    
                        case RIGHT_VA:
                        case LEFT_VA:
                        case BINO_VA:
                            selectHolder._selectedPreFinishControllers.setVisibility(View.VISIBLE);
                            break;
                        case FV_DONE:
                            selectHolder._selectedFvEndControllers.setVisibility(View.VISIBLE);
                            break;
                        case FULL_EXAM_DONE:
                            selectHolder._selectedNvEndControllers.setVisibility(View.VISIBLE);
                            break;
                    }
    
                    String textHeader = String.format("%s\n%s", item.getTestUpperHeader(),item.getTestLowerHeader());
                    selectHolder._selectedTestName.setText(textHeader);
                    selectHolder._selectedTestDesc.setText(item.getTestDescription());
    
                    break;
            }
    
            return convertView;
        }
    
        public void setData(List data)
        {
            _data = data;
            notifyDataSetChanged();
        }
    
        public static class RegularViewHolder
        {
            public TextView     _regTestWithoutLowerHeader;
            public TextView     _regTestUpperHeader;
            public TextView     _regTestLowerHeader;
            public ImageView    _regTestImage;
        }
    
        public static class SelectedViewHolder
        {
            public TextView         _selectedTestName;
            public TextView         _selectedTestDesc;
            public RelativeLayout   _selectedPreFinishControllers;
            public RelativeLayout   _selectedFvEndControllers;
            public RelativeLayout   _selectedNvEndControllers;
        }
    

    only if the item is skipped the adapter inflate to an empty layout as shown on previous step, still I had the divider height issue

    2) To fix divider height I changed the divider height to 0 instead of 12dp, each item that is not skipped I added another layout with transparent background (the divier color in my case should be transparent) and added bottom padding of 12dp

    for example one of my items

        
    
    
        
    
            
    
            
    
            
    
            
        
    
    
    

    maybe its not elegant but this solution worked for me

提交回复
热议问题