Bộ phân chia danh sách Android


97

Tôi có mã này:

<ListView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id="@+id/cashItemsList"
     android:cacheColorHint="#00000000"
     android:divider="@drawable/list_divider"></ListView>

ở đâu @drawable/list_divider:

<shape
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:shape="line">
 <stroke
   android:width="1dp"
   android:color="#8F8F8F"
   android:dashWidth="1dp"
   android:dashGap="1dp" />
</shape>

nhưng tôi không thể nhìn thấy bất kỳ dải phân cách nào.


1
Tôi không biết tại sao nhưng mã bị thiếu. ở đây nó là một lần nữa:
oriharel

<ListView android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: id = "@ + id / cashItemsList" android: cacheColorHint = "# 00000000" android: divider = "@ drawable / list_divider"> </ListView>
oriharel

1
và bộ chia danh sách là: <shape xmlns: android = " schemas.android.com/apk/res/android " android: shape = "line"> <stroke android: width = "1dp" android: color = "# 8F8F8F" android: dashWidth = "1dp" android: dashGap = "1dp" /> </ hình>
oriharel

sử dụng khối mã (biểu tượng 101010) để chèn mã, đặc biệt là mã XML / HTML / SGML. Tôi đã sửa bài của bạn bây giờ.
Lie Ryan

Có thể lý do của sự cố của bạn là trong ListAdapter của bạn. Chỉ cần cố gắng trả về true của areAllItemsEnabled () của bộ điều hợp. Hoặc xem stackoverflow.com/questions/5587826/…
grine4ka,

Câu trả lời:


175

Mọi người, đây là lý do tại sao bạn nên sử dụng 1px thay vì 1dp hoặc 1dip: nếu bạn chỉ định 1dp hoặc 1dip, Android sẽ giảm tỷ lệ đó. Trên thiết bị 120dpi, nó sẽ trở thành một cái gì đó giống như dịch 0,75px, làm tròn thành 0. Trên một số thiết bị, dịch thành 2-3 pixel và nó thường trông xấu xí hoặc luộm thuộm

Đối với dải phân cách, 1px là chiều cao chính xác nếu bạn muốn có dải phân cách 1 pixel và là một trong những ngoại lệ cho quy tắc "mọi thứ nên được nhúng". Nó sẽ là 1 pixel trên tất cả các màn hình. Ngoài ra, 1px thường trông đẹp hơn trên màn hình hdpi trở lên

Bản chỉnh sửa "Không phải là năm 2012 nữa": bạn có thể phải chuyển sang dp / dip bắt đầu từ một mật độ màn hình nhất định


4
Chà. Cứu cuộc đời tôi. Nên là một phần của hướng dẫn chính thức của Android để sử dụng "nhúng"
deeJ

Tôi đồng ý. Ít nhất họ nên đề cập đến quy tắc đó về px như một ví dụ về lý do tại sao họ có nó.
Joe Plante

6
Trên ldpi, 1dp = 0,75 pixel, do đó làm tròn xuống 0. Khi đó dải phân cách sẽ không được vẽ, điều này có thể gây ra vấn đề cho những người khác. Điều này cũng đề cập đến các câu lệnh khác trong chủ đề này phàn nàn về việc sử dụng px hoàn toàn. Điều này có thể hoặc không thể là giải pháp cho vấn đề của mình và nó tùy thuộc vào ông tuyên bố hay không nó là
Joe Plante

18
1px sẽ cực kỳ nhỏ trên thiết bị xxhdpi và tại một số điểm (khi thiết bị tiếp tục có mật độ cao hơn) sẽ quá nhỏ để có thể nhìn thấy được. Dip tránh điều này và một giải pháp khác cho các thiết bị ldpi là sử dụng 1px trong thư mục giá trị-ldpi và 1dip cho mật độ cao hơn.
eski

2
Khi tôi đăng phản hồi đó, xxhdpi tôi nghĩ vừa mới xuất hiện. Tuy nhiên, bài viết của bạn có ý nghĩa, đặc biệt là với xxxhdpi và có thể xxxxhdpi trên đường chân trời
Joe Plante

54

Đây là một cách giải quyết, nhưng phù hợp với tôi:

Đã tạo res / drawable / divider.xml như sau:

<?xml version="1.0" encoding="UTF-8"?>
<shape
  xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient android:startColor="#ffcdcdcd" android:endColor="#ffcdcdcd" android:angle="270.0" />
</shape>

Và trong styles.xml cho mục listview, tôi đã thêm các dòng sau:

    <item name="android:divider">@drawable/divider</item>
    <item name="android:dividerHeight">1px</item>

Phần quan trọng là bao gồm cài đặt 1px này. Tất nhiên, drawable sử dụng gradient (với 1px) và đó không phải là giải pháp tối ưu. Tôi đã thử sử dụng thuốc đột quỵ nhưng không hiệu quả. (Bạn dường như không sử dụng các kiểu, vì vậy chỉ cần thêm thuộc tính android: dividerHeight = "1px" cho ListView.


14
Hoặc sử dụng 1dp để thực hành tốt nhất.
Tristan Warner-Smith

2
Tại sao bạn sử dụng góc 270? Các đường phân chia danh sách là các đường ngang. 270 là một gradient dọc.
Christopher Perry

Đây không phải là một lỗi trong Android? Không phải một hình dạng đường làm dải phân cách chỉ hoạt động?
Diederik

8
1px tài sản là ngoại lệ cho quy tắc
Joe Plante

1
@ TristanWarner-Smith điều này không chính xác. bạn cần sử dụng 1px trong trường hợp này. xem câu trả lời được chấp nhận.
mpellegr

26

Thêm android:dividerHeight="1px"và nó sẽ hoạt động:

<ListView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id="@+id/cashItemsList"
     android:cacheColorHint="#00000000"
     android:divider="@drawable/list_divider" android:dividerHeight="1px"></ListView>

15

Vấn đề bạn đang gặp phải bắt nguồn từ thực tế là bạn đang thiếu android: dividerHeight, thứ bạn cần và thực tế là bạn đang cố gắng chỉ định độ đậm dòng trong tệp có thể vẽ của mình, điều mà bạn không thể làm với dải phân cách đối với một số lý do kỳ quặc. Về cơ bản để làm cho ví dụ của bạn hoạt động, bạn có thể làm một số điều như sau:

Tạo có thể vẽ của bạn dưới dạng hình chữ nhật hoặc đường thẳng, hoặc hoạt động mà bạn không thể cố gắng đặt bất kỳ kích thước nào trên đó, vì vậy:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line">
     <stroke android:color="#8F8F8F" android:dashWidth="1dp" android:dashGap="1dp" />
</shape>

HOẶC LÀ:

<shape xmlns:android="http://schemas.android.com/apk/res/android"  android:shape="rectangle">
     <solid android:color="#8F8F8F"/>
</shape>

Sau đó, tạo một phong cách tùy chỉnh (chỉ là tùy chọn nhưng tôi muốn có thể sử dụng lại nội dung)

<style name="dividedListStyle" parent="@android:style/Widget.ListView">
    <item name="android:cacheColorHint">@android:color/transparent</item>
    <item name="android:divider">@drawable/list_divider</item>
    <item name="android:dividerHeight">1dp</item>
</style>

Cuối cùng khai báo chế độ xem danh sách của bạn bằng kiểu tùy chỉnh:

<ListView
     style="@style/dividedListStyle"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id="@+id/cashItemsList">
</ListView>

Tôi cho rằng bạn biết cách sử dụng những đoạn mã này, nếu không hãy cho tôi biết. Về cơ bản câu trả lời cho câu hỏi của bạn là bạn không thể đặt độ dày của dải phân cách trong có thể kéo, bạn phải để chiều rộng không xác định ở đó và sử dụng android: dividerHeight để đặt nó thay thế.


8

Từ tài liệu:

public void setDivider(Drawable divider) on ListView

/**
 * Sets the drawable that will be drawn between each item in the list. If the drawable does
 * not have an intrinsic height, you should also call {@link #setDividerHeight(int)}
 *
 * @param divider The drawable to use.
 */

Có vẻ như setDividerHeight()phải được gọi để dải phân cách hiển thị nếu nó không có chiều cao nội tại


5

Của bạn @drawable/list_dividesẽ trông như thế này:

<shape
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:shape="line">
 <stroke
   android:height="1dp"
   android:color="#8F8F8F"
   android:dashWidth="1dp"
   android:dashGap="1dp" />
</shape>

Trong phiên bản của bạn, bạn cung cấp một android:width="1dp", chỉ cần thay đổi nó thành một android:height="1dp"và nó sẽ hoạt động!


5
android: height không phải là một thuộc tính hợp lệ cho nét vẽ và chiều rộng chỉ có nghĩa là độ rộng của nét vẽ chứ không phải độ dài của nó. Lý do duy nhất khiến "giải pháp" của bạn hoạt động là Android không nhận ra giá trị chiều cao đó.
Justin Buser

4

Từ tài liệu :

vị trí tập tin:

res / drawable / filename.xml

Tên tệp được sử dụng làm ID tài nguyên .

về cơ bản, bạn sẽ cần đặt một tệp có tên list_divider.xmltrong res/drawable/đó để bạn có thể truy cập nó bằng R.drawable.list_divider; nếu bạn có thể truy cập nó theo cách đó, thì bạn có thể sử dụng android:divider="@drawable/list_divider"trong XML cho ListView.


Tôi làm việc với nhật thực, vì vậy nếu tôi không làm điều đó, mã sẽ không biên dịch. vì vậy, với tệp tại chỗ, vẫn có vẻ như chế độ xem danh sách bỏ qua dải phân cách tùy chỉnh của tôi.
oriharel

2

Một số người có thể gặp phải một đường thẳng. Tôi đã giải quyết vấn đề này bằng cách thêm android:layerType="software"vào chế độ xem tham chiếu có thể vẽ.


1

Các tài liệu android cảnh báo về những thứ biến mất do lỗi round-off ... Có lẽ hãy thử dp thay vì px, và có lẽ cũng nên thử> 1 đầu tiên để xem liệu đó có phải là vấn đề hoàn toàn hay không.

xem http://developer.android.com/guide/practices/screens_support.html#testing

cho phần "Hình ảnh có chiều cao / chiều rộng 1 pixel"


Vâng. NẾU bạn đang sử dụng 2 dp / dip trở lên, thì bạn vẫn ổn. Tuy nhiên, nếu bạn chỉ muốn dải phân cách 1 pixel đó, px là cách để thực hiện. Bạn cũng nhận được nhiều màn hình bất động sản hơn với 1px, cộng với 1px thường trông đẹp hơn
Joe Plante

1

Tôi gặp vấn đề tương tự. Tuy nhiên, chế độ xem 1px dường như không hoạt động trên Nexus 7. Tôi nhận thấy rằng mật độ màn hình là 213, nhỏ hơn 240 được sử dụng trong xhdpi. Vì vậy, người ta nghĩ rằng thiết bị có mật độ mdpi.

Giải pháp của tôi là làm cho nó để dimensthư mục có một dividerHeighttham số. Tôi đặt nó 2dptrong values-mdpithư mục nhưng 1dptrong values-hdpithư mục vv.


1

bạn quên một chữ "r" ở cuối dải phân cách trong bố cục xml của dải phân cách

bạn gọi layout @ drawable / list_divider nhưng bộ chia xml của bạn được đặt tên là "list_divide"


-1

đặt android: dividerHeight = "1dp"

<ListView
            android:id="@+id/myphnview"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@drawable/dividerheight"
            android:background="#E9EAEC"
            android:clickable="true"
    android:divider="@color/white"
                android:dividerHeight="1dp"
                android:headerDividersEnabled="true" >
    </ListView>
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.