2011-08-14 17 views
10

Estoy intentando establecer márgenes izquierdos variables para los elementos en mi ListView. El problema se produce en mi adaptador personalizado en el método getView:No se puede establecer el margen del elemento en ListView mediante el adaptador personalizado

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

inflamos el diseño list_item que es un RelativeLayout con algunos textViews interior. Luego intento establecer los márgenes usando RelativeLayout.LayoutParams. Recibo una excepción de lanzamiento de clase sobre esto, pero el tipo normal de LayoutParams no tiene ningún método para establecer los márgenes.

¿Cuál es la mejor manera de establecer el margen?

Aquí está el error

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) 

Respuesta

6

Encontré que la manera más simple de resolver este problema era simplemente envolver mi artículo en FrameLayout en el xml. Entonces pude configurar fácilmente el relleno izquierdo como deseé, dándome así el aspecto exacto que estaba esperando.

6

no estoy seguro de donde tiene su excepción ClassCast, es que en convertView.setLayoutParams(lp);? En caso afirmativo, proporcione su archivo xml list_item, por favor. Como su diseño es RelativeLayout, debe proporcionar un RelativeLayout.LayoutParams, como lo hizo.

EDITAR: Debido a la ListView, el mismo LayoutParams como padre tiene que ser suministrado, un AbsListView.LayoutParams. Sin embargo, este tipo de diseño no proporciona el setter margin. En otro hilo de stackoverflow, vi que tienes que inflar el diseño de esta manera: inflate(xml_id, listView, false); para indicar explícitamente que no hay conexión con el ListView y el contenido. Sin embargo, tampoco pude hacerlo funcionar.

Además, veo que está estableciendo el margen en la creación convertView. Si le gusta esto, solo los artículos que se crean primero tendrán su propio margen personalizado. Otro tendrá el margen de vista reciclado. No creo que sea lo que quieres.

+0

Parece que realmente ocurre después de que devuelvo el converView, aunque está en lo cierto al decir que necesito establecer el margen antes. Agregué el error a mi publicación. –

+1

Hice una aplicación simple para probarla, pero no logré que funcione. Te sugiero que utilices el relleno de View, que creo que tiene el mismo comportamiento. convertView.setPadding (0, c.getDepth() * 5, 0, 0); Perdón por no traer más ayuda:/ – Astrorvald

+0

Desafortunadamente, en realidad, quiero que se cambie toda la vista, y el relleno solo crea un espacio dentro de la vista. ¡Gracias por intentarlo! –

Cuestiones relacionadas