2011-10-27 26 views
5

「完了」とマークすることができるいくつかのアイテムのリストビューがあります。トグルボタンには「完了アイテムを隠す」と記載されています。私は、リストに残された空間がまだあるsetVisibility(View.GONE)を設定することにより、項目を非表示にしたときに行うAndroidのセットView.GONEはリストビューのスペースを解放しません

しかし..

はハードリストビューでリスト項目を切り替えることではないでしょうか?あなたもリストアダプタで動作する必要があります

答えて

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のソリューションとその下のコメントを使って解決することができました。ちょっと明確にするために比較的完全なアダプタを表示したかっただけです。

私は在庫アイテムの1つのデータ範囲を保持するフィールドを持つStockItemクラスを持っています。カスタムArrayAdapterの場合、コンストラクタはデータベーステーブルから取得したStockItemsの完全なリストを取得し、将来追加する追加/削除メソッドもこのリスト(mList)で動作します。しかし、私は、()メソッドfilterListを用いて生成された第2のリスト(mFilteredList)から読み取るgetViewメソッド()と同様にgetCount()をオーバーライド:

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()はメインスレッドで問題になるかもしれませんが、この質問には関係ありません。

EDIT:mFilteredListからアイテムを返すには、getItem(position)メソッドもオーバーライドする必要があります。

@Override 
public StockItem getItem(int position) { 

    return mFilteredList.get(position); 
} 
0

何も解決しなかったので、私の問題は空き領域で解決されていなかったので、私は解決策を考え出しました。

私は2つの主要な問題だった:) 1を私は私が最初の問題は、私はまだ持っていた解決した場合でも、また12dpのdividerHeight持っていた)ので、私は行って 2への可視性を設定するビューの空きスペースを持っていましたリストビュー

ソリューションの固定分周器の高さ:

1.1)Iは

1をスキップしているアイテムのアダプタに通知するために、リストのデータをブール値を追加。2)私は、私は私のリストビュー内のビューのいくつかのタイプ、選択項目、定期的なアイテムを持っているし、今だけのアイテム

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; 
    } 

をスキップ)

<?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「の項目をスキップ」をシミュレートするために、空のレイアウトを作成しました前のステップに示すように、アイテムは、アダプターが空のレイアウトに膨張スキップされた場合、まだ私は0の代わりに12dp、 各項目に分周器の高さを変更デバイダ高さを修正するために分周器の高さの問題 )を有しています私は別のレイアウトを追加しました。透明な背景(私の場合はdivierの色は透明でなければならない)と私の項目の1

<?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> 

多分そのエレガントではない例えば12dp

の下パディングを追加しましたが、このソリューションは私のために

関連する問題