Android-адаптер возвращает LinearLayout - PullRequest
3 голосов
/ 20 августа 2011

У меня есть специальный адаптер для ListView, и мне нужно вернуть LinearLayout из getView ().Причина, по которой я это делаю, заключается в том, что у меня есть пользовательский компонент, который расширяет LinearLayout и должен быть создан из кода.Проблема в том, что если я возвращаю LinearLayout из getView (), приложение вылетает.Как я могу заставить это работать?Я не могу надуть View из xml, все должно быть сделано с помощью кода.

Вот getView ():

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
  LinearLayout lay = new LinearLayout(MyApplication.getContext()); // gets the context from extended Application class
  lay.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
  return lay;
}

И журнал того, что происходит:

08-20 08:40:07.886: DEBUG/AndroidRuntime(13039): Shutting down VM
08-20 08:40:07.896: WARN/dalvikvm(13039): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0)
08-20 08:40:07.926: ERROR/AndroidRuntime(13039): FATAL EXCEPTION: main
        java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
        at android.widget.ListView.setupChild(ListView.java:1870)
        at android.widget.ListView.makeAndAddView(ListView.java:1839)
        at android.widget.ListView.fillDown(ListView.java:670)
        at android.widget.ListView.fillFromTop(ListView.java:727)
        at android.widget.ListView.layoutChildren(ListView.java:1689)
        at android.widget.AbsListView.onLayout(AbsListView.java:1260)
        at android.view.View.layout(View.java:7278)
        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:7278)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:912)
        at android.view.View.layout(View.java:7278)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
        at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1243)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1049)
        at android.view.View.layout(View.java:7278)
        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:7278)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
        at android.view.View.layout(View.java:7278)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
        at android.view.View.layout(View.java:7278)
        at android.view.ViewRoot.performTraversals(ViewRoot.java:1172)
        at android.view.ViewRoot.handleMessage(ViewRoot.java:1921)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:143)
        at android.app.ActivityThread.main(ActivityThread.java:4196)
        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:839)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
        at dalvik.system.NativeStart.main(Native Method)

Спасибо

// edit: Если кто-нибудь может предоставить мне рабочий образец, который создает LinearLayout через код и возвращает его из getView (), это, скорее всего, решит эту проблему

1 Ответ

11 голосов
/ 20 августа 2011

Установите AbsListView.LayoutParams вместо LinearLayout.LayoutParams.
LayoutParams устанавливается для ребенка в ViewGroup. Поскольку ваш макет является дочерним по отношению к AbsListView, вы должны установить его layoutparams.

...