简体   繁体   English

Android | 如何向视图添加布局

[英]Android | How to add a layout to a view

I'm new to Android programming and I would like to make a listview item to have a layout. 我是Android编程的新手,我想制作一个listview项目以进行布局。

final ListView lv = (ListView) findViewById(R.id.lv);
String[] fruits = new String[] { "A", "B", "C" };
final List<String> fruits_list = new ArrayList<>(Arrays.asList(fruits));

final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_list_item_1, fruits_list) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        View view = super.getView(position,convertView,parent);
        view.setLayoutParams(new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT));
        LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = layoutInflater.inflate(R.layout.row2,null); // code is working without these code but no layout
        return view;
    }
};

lv.setAdapter(arrayAdapter);

The code is working if I don't include view = layoutInflater.inflate(R.layout.row2,null); 如果我不包含view = layoutInflater.inflate(R.layout.row2,null);该代码将正常工作 , but it has no layout, just text. ,但没有布局,只有文本。 I want it to have a design. 我希望它有一个设计。

If I include view = layoutInflater.inflate(R.layout.row2,null); 如果我包括view = layoutInflater.inflate(R.layout.row2,null); , error show up ,错误显示

You must supply a resource ID for a TextView

and

    FATAL EXCEPTION: main
  Process: com.example.sample.myapplication, PID: 30783
  java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
      at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:401)
      at android.widget.ArrayAdapter.getView(ArrayAdapter.java:371)
      at com.example.sample.myapplication.MainActivity$1.getView(MainActivity.java:51)
      at android.widget.AbsListView.obtainView(AbsListView.java:2363)
      at android.widget.ListView.measureHeightOfChildren(ListView.java:1326)
      at android.widget.ListView.onMeasure(ListView.java:1233)
      at android.view.View.measure(View.java:19857)
      at android.support.constraint.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:934)
      at android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:973)
      at android.view.View.measure(View.java:19857)
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
      at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
      at android.view.View.measure(View.java:19857)
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
      at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:400)
      at android.view.View.measure(View.java:19857)
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
      at android.view.View.measure(View.java:19857)
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
      at android.view.View.measure(View.java:19857)
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
      at com.android.internal.policy.DecorView.onMeasure(DecorView.java:689)
      at android.view.View.measure(View.java:19857)
      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2275)
      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1366)
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1619)
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6337)
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
      at android.view.Choreographer.doCallbacks(Choreographer.java:686)
      at android.view.Choreographer.doFrame(Choreographer.java:621)
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
      at android.os.Handler.handleCallback(Handler.java:751)
      at android.os.Handler.dispatchMessage(Handler.java:95)
      at android.os.Looper.loop(Looper.java:154)
      at android.app.ActivityThread.main(ActivityThread.java:6119)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
   Caused by: java.lang.ClassCastException: android.support.constraint.ConstraintLayout cannot be cast to android.widget.TextView
      at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:388)
      at android.widget.ArrayAdapter.getView(ArrayAdapter.java:371) 
      at com.example.sample.myapplication.MainActivity$1.getView(MainActivity.java:51) 
      at android.widget.AbsListView.obtainView(AbsListView.java:2363) 
      at android.widget.ListView.measureHeightOfChildren(ListView.java:1326) 
      at android.widget.ListView.onMeasure(ListView.java:1233) 
      at android.view.View.measure(View.java:19857) 
      at android.support.constraint.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:934) 
      at android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:973) 
      at android.view.View.measure(View.java:19857) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 
      at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) 
      at android.view.View.measure(View.java:19857) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083) 
      at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:400) 
      at android.view.View.measure(View.java:19857) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 
      at android.view.View.measure(View.java:19857) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083) 
      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464) 
      at android.widget.LinearLayout.measureVertical(LinearLayout.java:758) 
      at android.widget.LinearLayout.onMeasure(LinearLayout.java:640) 
      at android.view.View.measure(View.java:19857) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) 
      at com.android.internal.policy.DecorView.onMeasure(DecorView.java:689) 
      at android.view.View.measure(View.java:19857) 
      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2275) 
      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1366) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1619) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6337) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:686) 
      at android.view.Choreographer.doFrame(Choreographer.java:621) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860) 
      at android.os.Handler.handleCallback(Handler.java:751) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:154) 
      at android.app.ActivityThread.main(ActivityThread.java:6119) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

The error happens because android.R.layout.simple_list_item_1 just contains a TextView, and the inflated view from R.layout.row2 probably contains something else: 发生错误是因为android.R.layout.simple_list_item_1仅包含TextView,而R.layout.row2的展开视图可能还包含其他内容:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:minHeight="?android:attr/listPreferredItemHeightSmall" />

It looks like you want to use R.layout.row2 as the layout for each item, which contains a ConstraintLayout? 看起来您想使用R.layout.row2作为每个项目的布局,其中包含ConstraintLayout? You could try replacing the layout in the ArrayAdapter declaration like: 您可以尝试替换ArrayAdapter声明中的布局,例如:

final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String> (this, R.layout.row2, fruits_list)

In that case you shouldn't need to inflate the layout as it will be handled in the ArrayAdapter base class. 在那种情况下,您不需要膨胀布局,因为它将在ArrayAdapter基类中处理。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM