我已经完成了关于这件事的所有研究。我知道 Google 认为这毫无意义,而开发人员知道事实并非如此。我也知道没有已知的解决方法,但我知道我已经接近了。用户 DougW 发布了以下代码:
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 < 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);
}
}
这几乎可以为我完成工作。但是当我尝试它时,我在 listItem.measure(0, 0) 行得到一个 NullPointer 异常。listItem 本身已初始化,但该方法无论如何都会引发异常。请告诉我如何解决这个问题。
这是我的代码:
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 < 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);
}
}
我正在研究的另一个解决方法是使用我的自定义视图的 onWindowFocusChanged 方法。它告诉了视图的确切高度。问题是当我仍然在我的 Activiy 的 onCreate 方法中时,事件没有被触发,也没有在我的 Activity 的 onWindowFocusChanged 方法中。我尝试了一个自定义事件,但它从未触发(它被放置在我的自定义视图的 onWindowFocusChanged 方法中,而侦听器在我的 Activity 的 onWindowFocusChanged 方法中)。