2013-07-21 2 views
0

У меня есть ListView, и мне нужно изменить высоту строк в зависимости от высоты ListView. Это потому, что я хотел бы показывать только фиксированное количество строк за раз, но, учитывая проблему с несколькими экранами, мне нужно вычислить высоту программно.Изменение высоты строки программно в ListView

Проблема, когда getView() метод моего пользовательского адаптера возвращает вид, андроид возникает исключение:

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/Andro idRuntime (620): at android.view.LayoutInflater.inflate (LayoutInflater.java:396) 07-21 15: 17: 00.391: E/AndroidRuntime (620): на 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): at 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): at 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): at android.widget.AbsListView.onLayout (AbsListView.java:1863) 07-21 15: 17: 00.391: E/AndroidRuntime (620): at android.view.View.layout (View.java:11278) 07-21 15: 17: 00.391: E/AndroidRuntime (620): at 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): at 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): at 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): at android.view.View.layout (View.java:11278) 07-21 15: 17: 00.391: E/AndroidRuntime (620): at 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): at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1486) 07-21 15: 17: 00.391: E/AndroidRuntime (620): at 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.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): at android.widget.FrameLayout.onLayout (FrameLayout.java:431) 07-21 15: 17: 00.391: E/AndroidRuntime (620): at android.view.View.layout (View.java: 11278) 07-21 15: 17: 00.391: E/AndroidRuntime (620): at android.view.ViewGroup.layout (ViewGroup.java:4224) 07-21 15: 17: 00.391: E/AndroidRuntime (620) : at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1628) 07-21 15: 17: 00.391: E/AndroidRuntime (620): на android.widget.LinearLayout.layoutVertical (линейный) Layout.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.FrameLayout.onLayout (FrameLayout.java:431) 07-21 15: 17: 00.391: E/AndroidRuntime (620) : at 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): at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1489) 07-21 15: 17: 00.391: E/AndroidRu ntime (620): at android.view.ViewRootImpl.handleMessage (ViewRootImpl.java:2442) 07-21 15: 17: 00.391: E/AndroidRuntime (620): at android.os.Handler.dispatchMessage (Handler.java: 99) 07-21 15: 17: 00.391: E/AndroidRuntime (620): at android.os.Looper.loop (Looper.java:137) 07-21 15: 17: 00.391: E/AndroidRuntime (620) : at android.app.ActivityThread.main (ActivityThread.java:4424) 07-21 15: 17: 00.391: E/AndroidRuntime (620): at java.lang.reflect.Method.invokeNative (родной метод) 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): at com .android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:784) 07-21 15: 17: 00.391: E/AndroidRuntime (620): at com.android.internal.os.ZygoteInit.main (Zyg oteInit.java:551) 07-21 15: 17: 00,391: Е/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); 

     } 

Он работает нормально. (Но он показывает больше строк, чем я хочу)

Я нашел много ответов на эту проблему, но никто не работает для меня. Любое предложение, пожалуйста?

ответ

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).

Смежные вопросы