2011-10-27 23 views
5

Tôi có một listview với một số mặt hàng có thể được đánh dấu là "thực hiện". Ngoài ra còn có một nút chuyển đổi cho biết "ẩn các mục đã thực hiện".Android thiết lập View.GONE không "phát hành" không gian trong listview

Tuy nhiên, khi tôi làm ẩn các mục bằng cách thiết lập setVisibility (View.GONE) vẫn còn là không gian còn lại trong danh sách ..

Không nên quá khó để chuyển đổi danh sách các mục trong một listview?

Trả lời

9

Thay đổi android: layout_height = "wrap_content" thành android: layout_height = "fill_parent" đã khắc phục vấn đề .. đã được thử nghiệm với danh sách dài .. với danh sách ngắn cùng một không gian nằm phía trên danh sách .. Lỗi lầm.

Cảm ơn tất cả vì đã trợ giúp .. mọi thứ hiện đang hoạt động.

+0

Xin chúc mừng về giải pháp. Khi bạn có thể, hãy đảm bảo đánh dấu câu trả lời của bạn là 'được chấp nhận' để những người khác có thể học hỏi từ bạn thành công. Chúc mừng ~ –

+5

không hoạt động cho phụ huynh điền. – Thushara

1

bạn cũng nên hoạt động trên bộ điều hợp danh sách ...

+0

này là tất cả trên bộ điều hợp danh sách. –

3

Bạn đang cố giấu toàn bộ mục danh sách? Nếu vậy tôi đoán rằng chế độ xem danh sách sẽ không thích điều đó bởi vì nó vẫn đang tính toán với cùng một số lượng mục. Tôi không nghĩ rằng nó sẽ bỏ qua nó bởi vì nó đã biến mất.

Giải pháp sạch sẽ là trả lại getCount khác và chỉ bỏ qua các mục bạn muốn ẩn. Hoặc xóa các mục khỏi danh sách được sử dụng nội bộ. Gọi notifyDataSetChanged trên bộ đổi nguồn khi bạn sửa đổi số lượng các mục trong danh sách.

+0

Vì vậy, hãy giữ một danh sách riêng biệt với tất cả và chỉ các mục được chọn và làm việc với bất kỳ danh sách nào là cần thiết để hiển thị thông tin chính xác .. Âm thanh như một kế hoạch. –

+0

Không hoạt động chút nào .. Tôi trả lại đúng mục và số đếm chính xác dựa trên trạng thái chuyển đổi của nút. Các mục trong danh sách là các mục chính xác, nhưng vẫn còn một khoảng trống lớn của khoảng trống tồn tại .. Có thể là các lớp chủ sở hữu vẫn còn đó? –

+0

'notifyDataSetChanged' sẽ kích hoạt danh sách để gọi' getView' cho tất cả các mục sử dụng giá trị 'getCount' trả về. Cái này cần phải dùng mẹo. Nhưng tôi không thể giúp bạn vì tôi không biết chi tiết. Có vẻ như có điều gì khác thực sự sai ... – Knickedi

0

Tôi đã có thể giải quyết vấn đề này bằng cách sử dụng giải pháp của Knickedi và các nhận xét bên dưới. Chỉ muốn hiển thị bộ chuyển đổi tương đối hoàn chỉnh của tôi để làm rõ nó một chút.

Tôi có lớp StockItem với các trường để chứa một loạt dữ liệu cho một mục cổ phiếu. Đối với ArrayAdapter tùy chỉnh, hàm tạo sẽ lấy danh sách đầy đủ các StockItems được lấy từ một bảng cơ sở dữ liệu và bất kỳ phương thức thêm/xóa nào tôi có thể thêm vào trong tương lai cũng sẽ hoạt động trên danh sách này (mList). Tuy nhiên, tôi gạt getView(), và getCount() để đọc từ một danh sách thứ hai (mFilteredList) được sản xuất bằng cách sử dụng phương pháp 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 (String tìm kiếm) được gọi từ một OnQueryTextListener và loại bỏ các mục danh sách có mô tả không khớp với văn bản đã nhập.

Trong trường hợp danh sách lớn, filterList() có thể là một vấn đề về chủ đề chính, nhưng điều đó không liên quan đến câu hỏi này.

EDIT: Phương thức getItem (vị trí) cũng phải được ghi đè để trả lại mục từ mFilteredList.

@Override 
public StockItem getItem(int position) { 

    return mFilteredList.get(position); 
} 
0

Sau khi kiểm tra nhiều giải pháp không giải pháp nào được giải quyết vấn đề của tôi với không gian trống nên tôi đã quyết định đưa ra giải pháp của mình.

Tôi có hai vấn đề chính: 1) Tôi đã có một không gian trống vì quan điểm mà tôi đặt khả năng hiển thị của nó là 2) Tôi cũng đã chia sẻHình ảnh 12dp, ngay cả khi tôi gặp vấn đề đầu tiên được giải quyết. chiều cao chia cố định của listview

giải pháp:

1.1) tôi đã thêm một boolean số liệu của danh sách, thông báo cho các bộ chuyển đổi nào trong mục được bỏ qua

1.2) Tôi tạo ra một bố trí trống để mô phỏng một "bỏ qua mục"

<?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) Tôi có một số loại quan điểm trong listview của tôi, mục đã chọn, mục thường xuyên và bây giờ bỏ qua mục

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

nếu mục bị bỏ qua bộ điều hợp thổi phồng sang bố cục trống như được hiển thị ở bước trước, tôi vẫn có vấn đề về chiều cao chia

2) Để sửa chiều cao bộ chia, tôi thay đổi chiều cao chia thành 0 thay vì 12dp, mỗi mục không bị bỏ qua Tôi đã thêm một bố cục khác nền trong suốt (màu divier trong trường hợp của tôi cần phải minh bạch) và thêm đệm đáy 12dp

ví dụ một trong các mục của tôi

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

có lẽ nó không thanh lịch nhưng giải pháp này làm việc cho tôi

Các vấn đề liên quan