2012-11-30 25 views
9

Tôi có một ListView với một ArrayAdapter liên quan hiển thị nội dung của nó trong một số hoạt động. Thật không may nó đã cần thiết bây giờ, rằng ListView của tôi trong một trong các thiết lập không hiển thị tất cả các yếu tố của nó, nhưng chỉ là những nơi mà "tài sản" không được đặt thành true. Tôi muốn tránh sử dụng hai ArrayAdapters với nội dung khác nhau, kể từ đó tôi bằng cách nào đó cần phải giữ chúng trong đồng bộ. Tôi đã thử nó như thế này (phương pháp này bây giờ chỉ cần giả định rằng getView được gọi là trong bối cảnh mà chúng ta muốn ẩn một số yếu tố):Ẩn hàng khỏi ListView mà không chiếm không gian

public View getView(int position, View convertView, Context context) { 
.... 

    if(!arrayitems[position].isProperty()) { //arrayitems is the underlying array 
     convertView.setVisibility(View.VISIBLE); 
    } 
    else { 
     convertView.setVisibility(View.GONE); 
    } 
    return convertView; 
} 

này hoạt động, tuy nhiên tôi nhận được một hàng trắng nếu phần tử có isProperty == thật. Tôi muốn làm cho hàng vô hình theo nghĩa, rằng nó không chiếm bất kỳ không gian nữa. Điều đó có thể không?

Các tập tin XML được sử dụng cho convertView trông như thế này:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="5dp" 
    android:paddingBottom="5dp" 
    android:orientation="vertical"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 

     <TextView 
      android:id="@+id/text_item_time" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="4dp" 
      android:maxLines="1" 
      android:ellipsize="none" 
      android:textSize="12sp" 
      android:textStyle="bold" /> 

     <TextView 
      android:id="@+id/text_item_status" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="12sp" 
      android:textStyle="bold" /> 

    </LinearLayout> 

    <TextView android:id="@+id/text_item_text" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textSize="12sp" 
     android:maxLines="3" 
     android:ellipsize="none" /> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="2dp" 
     android:orientation="horizontal" > 

     <TextView 
      android:id="@+id/text_item_rating" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="4dp" 
      android:textSize="10sp" /> 

     <TextView 
      android:id="@+id/text_item_voted" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="10sp" /> 

    </LinearLayout> 

</LinearLayout> 

tôi đã cố gắng để phát lại tất cả android: layout_height = "wrap_content" với "fill_parent" nhưng nó không thay đổi bất cứ điều gì ...

Cảm ơn!

+0

Tôi không nhận được nó, thuộc tính boolean giống nhau cho tất cả các phần tử vì nó là một thuộc tính cho bộ điều hợp. Làm thế nào nó có thể biết những gì hàng ẩn? –

+0

xin lỗi, isProperty() tất nhiên là một phương pháp của các mục trong mảng – user1809923

+0

nếu vẫn còn có vấn đề xin vui lòng kiểm tra câu trả lời của tôi nó sẽ làm việc cho chắc chắn. –

Trả lời

1

Một người dùng khác có cùng sự cố và anh đã giải quyết vấn đề theo cách này: https://stackoverflow.com/a/7928923/1548679.

Tôi hy vọng điều này có thể giúp bạn.

Greets

+0

Cảm ơn bạn, tuy nhiên tôi không thể chuyển giải pháp của mình. Tôi đã thêm tệp xml đã sử dụng của mình cho convertView ở trên. – user1809923

3

Bạn có thể sử dụng cách bố trí getview của android: layout_height = "wrap_content" và làm sử dụng Tầm nhìn đi để che giấu bố trí của bạn

+0

Xin lỗi, tôi không hiểu bạn đang nói gì. Bạn có thể làm rõ giải pháp của bạn? – user1809923

3

Vậy điều gì Romain nghĩa được thêm một id để LinearLayout bạn

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="5dp" 
    android:paddingBottom="5dp" 
    android:orientation="vertical" 
    android:id="@+id/linear_layout"> 

Sau đó, trong Java của bạn, bạn sẽ làm gì

public View getView(int position, View convertView, Context context) { 
    .... 
    holder.lLayout = (LinearLayout) convertView.findViewById(R.id.linear_layout); 
    .... 
    if(!arrayitems[position].isProperty()) { //arrayitems is the underlying array 
     holder.lLayout.setVisibility(View.VISIBLE); 
    } 
    else { 
     holder.lLayout.setVisibility(View.GONE); 
    } 
    return convertView; 
    } 

Bạn có thể cần phải thay đổi nó một chút nếu tăng lượt xem của bạn một cách khác nhau. Tôi đã làm điều này bản thân mình và nó hoạt động thực sự tốt.

+1

Mặc dù tôi đã sử dụng 'View.GONE' nhưng tôi đã có một không gian trống ở cuối listview mà người dùng có thể cuộn qua. Để khắc phục nó, tôi đã cập nhật 'getCount()' để loại trừ các hàng ẩn khỏi tổng số đếm. Một thực hiện sạch hơn nhiều sẽ có được để giữ hai arraylists: một cho các dữ liệu ban đầu, và một cho adapter mà không bao gồm dữ liệu của các hàng ẩn. –

+0

Tôi đã làm điều đó trước và những gì tôi không thích về điều đó là sau đó em bé của bạn ngồi thêm dữ liệu. – MinceMan

+0

vâng tôi đồng ý - đó là lý do tại sao tôi không đi tuyến đó cho trường hợp cụ thể này :-) Tôi quên đề cập đến trong bình luận của mình ở trên: một khi 'getCount()' trả về một giá trị không bao gồm hàng dữ liệu bạn muốn ẩn, nên định vị các hàng dữ liệu ẩn vào cuối mảng được bộ điều hợp của bạn sử dụng. –

7

Đặt chế độ hiển thị của tất cả nội dung của chế độ xem danh sách thành GONE và sau đó đặt chế độ hiển thị của Chế độ xem thành .... sẽ ẩn hàng mà không chiếm không gian ..... nó làm việc cho tôi ngay cả khi tôi đã tìm kiếm điều này nhưng sau khi nghiên cứu tôi đã tìm thấy điều này ....

CHỈNH SỬA 1: Đặt hiển thị của Chế độ xem thành GONE là đủ. Không cần thiết lập khả năng hiển thị của phần tử con.

4

Tôi đang gặp vấn đề tương tự như bạn đã

Tôi đã figured it out bởi inflating another layout layout with no height and width

Adapter.java

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    LayoutInflater inflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    if (YOUR_CONDITION) { 
      return inflater.inflate(R.layout.blank_layout, parent, 
        false); 
    } else { 
      View vi = inflater.inflate(R.layout.list_item, parent, false); 
      return vi; 
    } 

} 

Và bố trí trống sẽ được như thế này,

blank_layout.xml

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


</LinearLayout> 
Các vấn đề liên quan