0

I'm new to Android programming and I would like to make a listview item to have a layout.

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); , but it has no layout, just text. I want it to have a design.

If I include 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)
takendarkk
  • 3,347
  • 8
  • 25
  • 37
bonsoy
  • 53
  • 1
  • 1
  • 7
  • Try this i hope help you https://stackoverflow.com/questions/8166497/custom-adapter-for-list-view –  Nov 22 '17 at 21:56

1 Answers1

0

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:

<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? You could try replacing the layout in the ArrayAdapter declaration like:

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.

fejd
  • 2,545
  • 1
  • 16
  • 39