Thêm lề dưới vào phần tử cuối cùng của ListView


82

Tôi cần thêm để thêm ListView với nền các mục phức tạp: khác nhau cho các góc chẵn / lẻ và tròn ở trên cùng và dưới cùng. Nó trông như thế này:

ListView hàng đầu

Tôi đã triển khai tất cả những thứ này thông qua danh sách cấp, nhưng còn một điều nữa tôi muốn làm. Bây giờ mục dưới cùng ở gần cuối màn hình. Tốt hơn là thêm một số không gian.

ListView dưới cùng có vẻ không tốt

Tôi không muốn thêm ký quỹ dưới cùng vào ListView, tôi chỉ cần ký quỹ cho mục cuối cùng.

Những cách tôi thấy để làm điều này:

Chân trang

Một kiểu hack - thêm chân trang với TextView trống vào ListView. Nhưng footer là thứ khá không ổn định, chúng thường biến mất sau khi InformDataSetChanged và không có cách nào để lấy lại chúng

Hình ảnh có pixel trong suốt

Tôi đã yêu cầu nhà thiết kế thêm các pixel trong suốt vào tài nguyên nền dưới cùng. Thật không may, trong trường hợp này, căn giữa theo chiều dọc bị phá vỡ hoàn toàn. Ví dụ, có 9patch như thế này:

9patch

Và bố cục như thế này:

<?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="match_parent"
        >
    <!-- View with background with transparent pixels on bottom -->
    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"
                  android:id="@+id/item"
                  android:background="@drawable/some_bgr"
                  android:padding="10dp"
            >
        <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"
                  android:text="Title"
                  android:layout_gravity="center"
                  android:textSize="18sp"
                />
        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
                  android:text="Detail"
                  android:layout_gravity="center"
                  android:textSize="18sp"
                />
    </LinearLayout>

    <!-- Just for marking place took by view -->
    <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"
                 android:layout_below="@id/item"
                 android:background="#88ff55"
            />
</RelativeLayout>

Kết quả:

Kết quả

Như bạn thấy, căn giữa không hoạt động. Không may. (BTW, nếu chỉ định 9patch này làm nền cho TextView, căn giữa hoạt động tốt. Nếu bạn biết bất kỳ bài viết nào giải thích điều này, vui lòng cho tôi biết.)

Thêm lề dưới vào mục cuối cùng trong triển khai Bộ điều hợp

Điều đó sẽ hoạt động, nhưng không rõ lý do tôi vẫn không thể làm cho nó hoạt động. Tôi không thích cách này, vì tôi không thích sửa đổi kích thước trong mã.

Vì thế

Đã có một cách tưởng tượng - xây dựng một số XML có thể vẽ được với bitmap và lề cụ thể. Theo khái niệm khả thi, điều đó có thể xảy ra, nhưng tôi không thể tìm thấy cách triển khai. Có thể ai đó biết?

Bất kỳ ý tưởng khác?


bạn chỉ muốn thêm lợi nhuận sau mục cuối cùng?
Goofy,

Đúng. Những âm thanh câu hỏi chính xác như thế này
darja

Vui lòng kiểm tra câu trả lời của tôi dưới đây
Goofy

Tôi thực sự sẽ xem xét sử dụng cách tiếp cận chân trang. Tôi chưa bao giờ thấy họ tự biến mất, đặc biệt là không sau một cuộc gọi đến notifyDataSetChanged(). Bạn có thể đang làm điều gì đó sai khác nếu điều đó đang xảy ra. Chân trang được quản lý bởi ListViewvà ít liên quan đến tập dữ liệu thực tế của bộ điều hợp.
MH.

Cách tốt nhất là [ stackoverflow.com/questions/6288167/… [1]: stackoverflow.com/questions/6288167/… nó thực sự giúp ích cho tôi
Bunyod vào

Câu trả lời:


280

Trong của bạn ListView, đặt a paddingBottomclipToPadding="false".

  <ListView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:paddingBottom="8dp"
      android:clipToPadding="false"
      android:scrollbarStyle="outsideOverlay"/>
  • Điều này cũng hoạt động cho RecyclerView.

  • Chỉ sử dụng android:scrollbarStyle="outsideOverlay"nếu bạn muốn thanh cuộn không tràn vào vùng đệm.


8dp từ dưới cùng của tôi bị cắt ... thực ra tôi chỉ muốn 8dp dưới cùng cho mục cuối cùng..vậy phải làm gì?
Elizabeth

2
@AndroidBeginner Tôi không hiểu bạn muốn gì. Đó chính xác là những gì điều này làm.
thợ đồng hồ

12
Đừng quên thêm android:scrollbarStyle="outsideOverlay"để thanh cuộn của bạn không ở bên trong phần đệm
gfpacheco

1
có thể có một số rắc rối với màu sắc. Dưới đệm có màu nền của listview, không màu nền của mục cuối cùng
grine4ka

Chúng tôi có thể quản lý chỉ báo làm mới SwipeRefreshLayout bằng cách này không?
Hemant Kaushik

8

thêm một chân trang trống trong danh sách của bạn như thế này:

TextView empty = new TextView(this);
empty.setHeight(150);
listview.addFooterView(empty);

vì điều đó, tôi khuyên bạn nên sử dụng: listview.addFooterView (trống, dữ liệu: null, isSelectable: false);
Simon

4

bạn cũng có thể làm điều đó từ mã nếu bạn muốn, ví dụ ở đây tôi phản ứng với EditText các tình huống khác nhau:

   if(s.toString().length()>0)
   {
      contacts_lv.setClipToPadding(false);
      contacts_lv.setPadding(0,0,0,270*screenDensity);
   }
   else
   {
      contacts_lv.setClipToPadding(true);
      contacts_lv.setPadding(0,0,0,0);
   }

2

Câu trả lời của thợ làm đồng hồ là hay nhất và khá thông minh. Bạn cũng có thể tạo dạng xem chân trang trống.


1
giải pháp đầu tiên không hoạt động, nhưng đề xuất của bạn đã thành công, thực sự là ý kiến ​​hay, cảm ơn bạn
Badr

1

Thêm hai dòng này vào mã XML listView của bạn:

android:transcriptMode="alwaysScroll"  
android:stackFromBottom="true"

0

Một giải pháp khác có thể là bạn tạo một chế độ xem giả với độ cao nhất định.

Trong bộ điều hợp của bạn trong getViewCount trả về 2.

Trong getCount, trả về yourData.size + 1.

Trong getViewType, hãy kiểm tra xem phần tử có phải là phần tử cuối cùng hay không, return 2;

Sử dụng loại này trong getView để điền mô hình.


-2

Tôi đoán bạn chỉ muốn thêm lợi nhuận vào mục cuối cùng:

Vì vậy, bạn có thể làm theo cách này, trong phương thức getview của bạn, chỉ mục của mục danh sách và kiểm tra xem nó có phải là mục cuối cùng hay không, sau đó thêm lề vào chế độ xem.


Tôi đã mô tả cách này trong "Thêm lề dưới vào mục cuối cùng trong triển khai Bộ điều hợp". Tôi tự hỏi nếu có nhiều cách thanh lịch hơn.
darja,

Tại sao bạn không muốn làm theo cách này?
Goofy

Vui lòng xem giải thích trong câu hỏi.
darja,

Không ý tưởng khác - vì vậy dường như là cách duy nhất
darja

@Goofy Làm cách nào để bạn thêm lề vào dạng xem hàng cuối cùng của danh sách?
vrunoa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.