0

我有一个 ListView,我需要根据 ListView 的高度更改行的高度。那是因为,我想一次只显示固定数量的行,但是考虑到多屏问题,我需要以编程方式计算高度。

问题是,当getView()我的自定义适配器的方法返回视图时,android 出现异常:

07-21 15:17:00.391: E/AndroidRuntime(620): 致命异常: 主要 07-21 15:17:00.391: E/AndroidRuntime(620): java.lang.UnsupportedOperationException: addView(View, LayoutParams) 不是在 AdapterView 中支持 07-21 15:17:00.391: E/AndroidRuntime(620): at android.widget.AdapterView.addView(AdapterView.java:471) 07-21 15:17:00.391: E/AndroidRuntime(620):在 android.view.LayoutInflater.inflate(LayoutInflater.java:497) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.view.LayoutInflater.inflate(LayoutInflater.java:396) 07-21 15 :17:00.391: E/AndroidRuntime(620): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 07-21 15:17:00.391: E/AndroidRuntime(620): at us.hucare.adapters。 ShelfAdapter.getView(ShelfAdapter.java:72) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.widget.AbsListView.obtainView(AbsListView.java:2033) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.widget.ListView.makeAndAddView(ListView.java:1772) 07-21 15:17:00.391: E/AndroidRuntime(620) : 在 android.widget.ListView.fillDown(ListView.java:672) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.widget.ListView.fillFromTop(ListView.java:732) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.widget.ListView.layoutChildren(ListView.java:1625) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.widget.AbsListView .onLayout(AbsListView.java:1863) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.view.View.layout(View.java:11278) 07-21 15:17:00.391: E /AndroidRuntime(620): 在 android.view.ViewGroup.layout(ViewGroup.java:4224) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.widget.FrameLayout.onLayout(FrameLayout.java: 431) 07-21 15:17:00.391:E/AndroidRuntime(620): 在 android.view.View.layout(View.java:11278) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.view.ViewGroup.layout(ViewGroup.java :4224) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628) 07-21 15:17:00.391: E/AndroidRuntime(620):在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1399) 07-21 15 :17:00.391: E/AndroidRuntime(620): 在 android.view.View.layout(View.java:11278) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.view.ViewGroup。布局(ViewGroup.java:4224) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.widget.FrameLayout.onLayout(FrameLayout.java:431) 07-21 15:17:00.391: E/安卓运行时(620):在 android.view.View.layout(View.java:11278) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.view.ViewGroup.layout(ViewGroup.java:4224) 07-21 15 :17:00.391: E/AndroidRuntime(620): 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1628) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.widget.LinearLayout。 layoutVertical(LinearLayout.java:1486) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1399) 07-21 15:17:00.391: E/ AndroidRuntime(620): 在 android.view.View.layout(View.java:11278) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.view.ViewGroup.layout(ViewGroup.java:4224 ) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.widget.RelativeLayout.onLayout(RelativeLayout.java:925) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android .view.查看。布局(View.java:11278)07-21 15:17:00.391:E/AndroidRuntime(620):在 android.view.ViewGroup.layout(ViewGroup.java:4224)07-21 15:17:00.391:E/ AndroidRuntime(620): 在 android.widget.FrameLayout.onLayout(FrameLayout.java:431) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.view.View.layout(View.java:11278 ) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.view.ViewGroup.layout(ViewGroup.java:4224) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android .widget.LinearLayout.setChildFrame(LinearLayout.java:1628) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1486) 07-21 15:17 :00.391: E/AndroidRuntime(620): 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1399) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.view.View.layout(查看.java:11278) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.view.ViewGroup.layout(ViewGroup.java:4224) 07-21 15:17:00.391: E/AndroidRuntime(620): 在android.widget.FrameLayout.onLayout(FrameLayout.java:431) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.view.View.layout(View.java:11278) 07-21 15: 17:00.391: E/AndroidRuntime(620): 在 android.view.ViewGroup.layout(ViewGroup.java:4224) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1489) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) 07-21 15:17:00.391: E/AndroidRuntime (620): 在 android.os.Handler.dispatchMessage(Handler.java:99) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 android.os.Looper.loop(Looper.java:137) 07-21 15:17:00.391:E/AndroidRuntime(620): 在 android.app.ActivityThread.main(ActivityThread.java:4424) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 java.lang.reflect.Method.invokeNative(Native方法) 07-21 15:17:00.391: E/AndroidRuntime(620): at java.lang.reflect.Method.invoke(Method.java:511) 07-21 15:17:00.391: E/AndroidRuntime(620) : 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 com.android.internal.os.ZygoteInit.main (ZygoteInit.java:551)07-21 15:17:00.391:E/AndroidRuntime(620):在 dalvik.system.NativeStart.main(本机方法)Method.invoke(Method.java:511) 07-21 15:17:00.391: E/AndroidRuntime(620): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 dalvik .system.NativeStart.main(本机方法)Method.invoke(Method.java:511) 07-21 15:17:00.391: E/AndroidRuntime(620): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 07-21 15:17:00.391: E/AndroidRuntime(620): 在 dalvik .system.NativeStart.main(本机方法)

这是第一部分getView()

if (convertView == null || mDataChanged) {
        mDataChanged = false;
        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.row_shelf, parent);
        LayoutParams params = convertView.getLayoutParams();
        if (params == null) { 
            params = new LayoutParams(LayoutParams.MATCH_PARENT, mShelfHeight); 
        } else {
            params.height = mShelfHeight;
        }
        convertView.setLayoutParams(params);
    }

我认为问题应该出在那几行,因为如果我在下面执行此代码:

if (convertView == null || mDataChanged) {
            mDataChanged = false;
            LayoutInflater inflater = (LayoutInflater) mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.row_shelf, null);

        }

它工作正常。(但它显示的行数比我想要的多)

我在这个问题上找到了很多答案,但似乎没有人适合我。请问有什么建议吗?

4

1 回答 1

0

抛出异常是因为该行:

convertView = inflater.inflate(R.layout.row_shelf, parent);

意味着您要膨胀布局并将该膨胀布局添加到 ViewGroup级,这将失败,因为ListView(作为 的子级AdapterView)不允许直接添加子视图。相反,您可能想要:

convertView = inflater.inflate(R.layout.row_shelf, parent, false);

之后,您可以将 设置LayoutParams为所需的高度(我建议您使用正确的LayoutParams, AbsListView.LayoutParams)。

于 2013-07-21T15:33:11.330 回答