2011-10-27 44 views

回答

9

將android:layout_height =「wrap_content」更改爲android:layout_height =「fill_parent」修復了問題..正在測試一個很長的列表..與一個簡短的列表相同的空間位於列表之上..愚蠢的錯誤。 。

感謝所有的幫助..一切正在工作。

+0

祝賀解決方案。如果可以,請確保將您的答案標記爲「已接受」,以便其他人可以向您學習成功。乾杯〜 –

+5

不適用於填寫父母。 – Thushara

1

你應該名單適配器還進行操作...

+0

這都在列表適配器上。 –

3

你試圖掩蓋整個列表項目?如果是這樣,我想列表視圖不會那樣,因爲它仍然在計算相同數量的項目。我不認爲它會因爲它消失而忽略它。

乾淨的解決方案將返回另一個getCount,只是忽略你想隱藏的項目。或從內部使用的清單中刪除項目。修改列表中項目的數量時,請在適配器上調用notifyDataSetChanged

+0

因此,保留一個單獨的列表與所有和唯一的檢查項目,並與任何需要顯示正確的信息列表工作..聽起來像一個計劃。 –

+0

完全不起作用。我根據按鈕的切換狀態返回正確的項目和正確的計數。在列表中的項目是正確的項目,但仍然存在一個很大的空白空白確實存在..是否持有人類仍然存在? –

+0

'notifyDataSetChanged'將觸發列表,使用返回的'getCount'值爲所有項目調用'getView'。這應該做的伎倆。但我不能幫助你,因爲我不知道任何細節。似乎有其他的東西真的是錯的... – Knickedi

0

我能夠使用Knickedi的解決方案和它下面的評論來解決這個問題。只是想展示我的相對完整的適配器來澄清一點。

我有類stockItem和字段來存儲單個庫存項目的一系列數據。對於自定義ArrayAdapter,構造函數接受從數據庫表中檢索到的StockItems的完整列表,並且我將來添加的任何添加/刪除方法也將在此列表上運行(mList)。然而,我推翻getView(),和getCount將()從一個第二列表(mFilteredList)來讀取使用該方法filterList()製備:

public class StockItemAdapter extends ArrayAdapter<StockItem> { 

    ... 
    ArrayList<StockItem> mList; 
    ArrayList<StockItem> mFilteredList; 

    public StockItemAdapter(Context context, int resource, ArrayList<StockItem> list) { 
      super(context, resource, list); 

    ... 
     mList = list; 
     mFilteredList = list; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View row = convertView; 
     StockItemHolder holder = null; 

     if (row == null) { 
      LayoutInflater inflater = ((Activity)mContext).getLayoutInflater(); 
      row = inflater.inflate(mResource, parent, false); 

      holder = new StockItemHolder(); 
      holder.imageView = (ImageView)row.findViewById(R.id.imageView); 
      ... 
      row.setTag(holder); 
     } else { 
      holder = (StockItemHolder)row.getTag(); 
     } 
     StockItem stockItem = mFilteredList.get(position); 
     if (stockItem.getImage() != null) { 
      holder.imageView.setImageBitmap(stockItem.getImage()); 
     } else { 
      holder.imageView.setImageResource(R.drawable.terencephilip); 
     } 
     ... 
     return row; 
    } 

    @Override 
    public int getCount() { 
     return mFilteredList.size(); 
    } 

    static class StockItemHolder { 

     ImageView imageView; 
     ... 
    } 

    public void filterList(String search) { 

     mFilteredList = new ArrayList<StockItem>(); 
     for (StockItem item : mList) { 
      if (item.getDescription().toLowerCase(Locale.ENGLISH) 
        .contains(search.toLowerCase(Locale.ENGLISH))) { 
       mFilteredList.add(item); 
      } 
     } 
     notifyDataSetChanged(); 
    } 
} 

filterList(字符串搜索)從OnQueryTextListener稱爲並刪除列表項其描述與輸入的文本不符。

在大列表的情況下,filterList()可能是主線程上的一個問題,但這與此問題無關。

編輯:必須重寫getItem(position)方法以從mFilteredList返回項目。

@Override 
public StockItem getItem(int position) { 

    return mFilteredList.get(position); 
} 
0

在檢查了很多解決方案後,沒有一個解決了我的問題與空的空間,所以我決定提出我的解決方案。

我有兩個主要問題: 1)我有,因爲我的可見性設置爲不見了 2)我也有dividerHeight的12dp視圖的一個空的空間,即使我有了第一個問題解決了我仍然有列表視圖

的固定分頻器高度解決方案:

1.1)我添加了一個布爾值到列表的數據,以通知所述項目的被跳過

1適配器。2)我創建了一個空的佈局來模擬「跳過項目」

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="0dp" 
    android:layout_height="0dp"/> 

1.3)我有幾種類型的觀點在我的列表視圖,選擇的項目,經常項目現在跳過項目

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<AdvancedTestData> _data; 
    private Context     _context; 
    private Typeface    _fontTypeFace; 

    public AdvancedTestAdapter(Context context, List<AdvancedTestData> 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<AdvancedTestData> 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; 
    } 

如果該項目被跳過,適配器膨脹爲空的佈局,如上一步所示,仍然我有分隔線高度問題

2)要修復分隔高度,我將分隔高度更改爲0而不是12dp, 每個項目沒有跳過我添加了另一個佈局透明背景(在我的情況下divier顏色應該是透明的),並添加12dp的底部填充

例如我的項目

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@android:color/transparent" 
    android:orientation="vertical" 
    android:paddingBottom="12dp" > 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@drawable/quick_test_background_selector" > 

     <ImageView 
      android:id="@+id/advanced_test_image" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/done_step" /> 

     <TextView 
      android:id="@+id/advanced_test_upper_name" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_marginLeft="5dp" 
      android:layout_toRightOf="@id/advanced_test_image" 
      android:gravity="center_vertical" 
      android:text="ETAPE 1" 
      android:textColor="@android:color/black" 
      android:textSize="14sp" 
      android:textStyle="bold" /> 

     <TextView 
      android:id="@+id/advanced_test_lower_name" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignBottom="@id/advanced_test_image" 
      android:layout_marginLeft="5dp" 
      android:layout_toRightOf="@id/advanced_test_image" 
      android:gravity="center_vertical" 
      android:text="ETAPE 1" 
      android:textColor="@android:color/black" 
      android:textSize="14sp" 
      android:textStyle="bold" /> 

     <TextView 
      android:id="@+id/step_without_lower_header" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignBottom="@id/advanced_test_image" 
      android:layout_alignTop="@id/advanced_test_image" 
      android:layout_centerVertical="true" 
      android:layout_marginLeft="5dp" 
      android:layout_toRightOf="@id/advanced_test_image" 
      android:gravity="center_vertical" 
      android:text="123" 
      android:textColor="@android:color/black" 
      android:textSize="14sp" 
      android:textStyle="bold" /> 
    </RelativeLayout> 

</RelativeLayout> 

也許它不是優雅的人,但這個解決方案爲我

相關問題