title: ListView in ScrollView potential workaround
body: <p>I've done all of the research on the matter. I know that Google thinks it's pointless and that the developers, know that it's not. I also know that there is no known workaround, but I know that I am close to making one. The user DougW posted this code:</p>
  
  <pre><code>public class Utility {
      public static void setListViewHeightBasedOnChildren(ListView listView) {
          ListAdapter listAdapter = listView.getAdapter(); 
          if (listAdapter == null) {
              // pre-condition
              return;
          }
  
          int totalHeight = 0;
          for (int i = 0; i &lt; listAdapter.getCount(); i++) {
              View listItem = listAdapter.getView(i, null, listView);
              listItem.measure(0, 0);
              totalHeight += listItem.getMeasuredHeight();
          }
  
          ViewGroup.LayoutParams params = listView.getLayoutParams();
          params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
          listView.setLayoutParams(params);
      }
  }
  </code></pre>
  
  <p>Which almost gets the job done for me. But when I try it, I get a NullPointer exception at the listItem.measure(0, 0) line. The listItem itself is initialized, but the method throws the exception anyway. Please tell me how I can fix this.</p>
  
  <p>Here is my code:</p>
  
  <pre><code>public class ExpenseReportsActivity extends Activity {
  
      private ListView lvReports;
      private ExpenseReportListAdapter adapter;
      private Button btnSend;
      private Button btnCancel;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.expensereports);
  
          lvReports = (ListView)findViewById(R.id.lv_reports);
          lvReports.setBackgroundResource(R.drawable.shape_expense_report_list);
  
          ColorDrawable cd = new ColorDrawable(0xFFffffff);
          lvReports.setDivider(cd);
          lvReports.setDividerHeight(1);
  
          adapter = new ExpenseReportListAdapter(this);
          lvReports.setAdapter(adapter);
  
          int totalHeight = 0;
          for (int i = 0; i &lt; adapter.getCount(); i++) {
              View listItem = adapter.getView(i, null, lvReports);
              listItem.measure(0, 0);
              totalHeight += listItem.getMeasuredHeight();
          }
  
          ViewGroup.LayoutParams params = lvReports.getLayoutParams();
          params.height = totalHeight + (lvReports.getDividerHeight() * (adapter.getCount() - 1));
          lvReports.setLayoutParams(params);
      }
  }
  </code></pre>
  
  <p>Another workaround I am working on is using my custom view's onWindowFocusChanged method. It tells the exacts height of the view. The problem is that the event isn't fired while I am still in my Activiy's onCreate method, nor in my Activity's onWindowFocusChanged method. I tried a custom event, but it never fired (it was placed inside my custom view's onWindowFocusChanged method and the listener was in my Activity's onWindowFocusChanged method).</p>