2011-08-14 23 views
10

Tôi đang cố gắng đặt lề trái cho các mục trong ListView của tôi. Sự cố xảy ra trong Bộ điều hợp tùy chỉnh của tôi theo phương thức getView:Không thể đặt lề của mục trong ListView bằng cách sử dụng Bộ điều hợp tùy chỉnh

public View getView(int position, View convertView, ViewGroup parent) { 
     if(convertView == null){ 
      Comment c = comments.get(position); 
      convertView = inflater.inflate(R.layout.list_item, null);    
      (TextView)convertView.findViewById(R.id.story)).setText(c.message); 


     } 
      RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); 
      lp.setMargins(0, c.getDepth() * 5, 0, 0);    
      convertView.setLayoutParams(lp); 

     return convertView; 
    } 

Chúng tôi thổi phồng bố cục list_item là RelativeLayout với một số textViews bên trong. Sau đó tôi cố gắng đặt lề bằng cách sử dụng RelativeLayout.LayoutParams. Tôi nhận được một ngoại lệ lớp học về điều này, nhưng các loại LayoutParams bình thường không có phương pháp để thiết lập các lề.

Cách tốt nhất để thiết lập lề là gì?

Đây là lỗi

java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams 
at android.widget.ListView.setupChild(ListView.java:1779) 
at android.widget.ListView.makeAndAddView(ListView.java:1748) 
at android.widget.ListView.fillDown(ListView.java:670) 
at android.widget.ListView.fillFromTop(ListView.java:727) 
at android.widget.ListView.layoutChildren(ListView.java:1598) 
at android.widget.AbsListView.onLayout(AbsListView.java:1273) 
at android.view.View.layout(View.java:7192) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
at android.view.View.layout(View.java:7192) 
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254) 
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130) 
at android.widget.LinearLayout.onLayout(LinearLayout.java:1047) 
at android.view.View.layout(View.java:7192) 
at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
at android.view.View.layout(View.java:7192) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:1145) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1865) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:130) 
at android.app.ActivityThread.main(ActivityThread.java:3835) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:507) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
at dalvik.system.NativeStart.main(Native Method) 

Trả lời

6

Tôi đã tìm thấy cách đơn giản nhất để giải quyết vấn đề này là chỉ cần bọc mục của tôi vào FrameLayout trong xml. Sau đó tôi có thể dễ dàng thiết lập các padding trái như tôi muốn, do đó cho tôi cái nhìn chính xác tôi đã hy vọng.

6

Tôi không chắc chắn nơi bạn có ngoại lệ ClassCast của bạn, là nó trên convertView.setLayoutParams(lp);? Nếu có, hãy cung cấp cho bạn list_item tệp xml. Khi bố cục của bạn là RelativeLayout, thì bạn phải cung cấp RelativeLayout.LayoutParams, như bạn đã làm.

EDIT: Do ListView, cùng LayoutParams như cha mẹ đã được cung cấp, một AbsListView.LayoutParams. Tuy nhiên, loại bố cục này không cung cấp thiết lập margin. Trên luồng stackoverflow khác, tôi thấy rằng bạn phải tăng bố cục như thế này: inflate(xml_id, listView, false); để cho biết rõ ràng không có kết nối với ListView và nội dung. Tuy nhiên, tôi không thể làm cho nó hoạt động.

Ngoài ra, tôi thấy bạn đang đặt lề trong việc tạo convertView. Nếu bạn làm như thế này, thì chỉ những mục được tạo trước tiên mới có lề tùy chỉnh riêng. Khác sẽ có biên độ xem tái chế. Tôi không nghĩ đó là những gì bạn muốn.

+0

Nó thực sự có vẻ xảy ra sau khi tôi trả về converView, mặc dù bạn đã chính xác rằng tôi cần phải thiết lập lề trước đó. Tôi đã thêm lỗi vào bài đăng của mình. –

+1

Tôi đã thực hiện một ứng dụng đơn giản để kiểm tra nó, nhưng không quản lý để làm cho nó hoạt động. Tôi đề nghị bạn sử dụng Xem đệm thay vào đó, mà tôi đã nghĩ rằng hành vi tương tự. convertView.setPadding (0, c.getDepth() * 5, 0, 0); Xin lỗi vì không mang thêm trợ giúp:/ – Astrorvald

+0

Rất tiếc, tôi thực sự muốn toàn bộ chế độ xem bị dịch chuyển và phần đệm chỉ tạo không gian trong chế độ xem. Cảm ơn bạn đã cố gắng! –

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