我已经做了所有关于这个问题的研究。我知道,谷歌认为这是毫无意义的,开发商,知道事实并非如此。我也知道,没有已知的解决方法,但我知道,我是接近决策之一。 DougW登载code用户:
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:
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)线得到一个空指针异常。 ListItem中本身被初始化,但无论如何,该方法将引发异常。请告诉我怎样才能解决这个问题。
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.
下面是我的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 < 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方法,也不在我活动的onWindowFocusChanged方法。我想自定义事件,但从来没有发射(把它放在我的自定义视图的onWindowFocusChanged方法中和听众在我活动的onWindowFocusChanged法)。
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).
好了,只要我得到了你的需求,我认为您可能只需要使用 ListView.addFooterView(视图v)
方法:
Ok, as far as I got your needs I think you may just use the ListView.addFooterView(View v)
method:
http://developer.android.com/reference/android/widget/ListView.html#addFooterView(android.view.View)
这可以让你把所有的列表项+几个按钮脚注中滚动为一个单独的块。
It will allow you to have all your list items + "a few buttons" footer to be scrolled as a single block.
所以,code应该是水木清华这样的:
So the code should be smth like that:
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
public class YourActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater factory = getLayoutInflater();
LinearLayout footer =
(LinearLayout) factory.inflate(R.layout.your_a_few_buttons_footer, null);
getListView().addFooterView(footer);
String[] array = new String[50];
for (int i = 0; i < 50;) { array[i] = "LoremIpsum " + (++i); }
setListAdapter(
new ArrayAdapter<String>(this, R.layout.list_item, array)
);
}
}
请注意,该医生说 addFooterView()
应该叫前 setListAdapter()
。
Note, the doc says addFooterView()
should be called BEFORE the setListAdapter()
.
更新:添加一个查看
在列表中使用 ListView.addHeaderView(视图V)的顶部
。需要注意的是,例如,的LinearLayout
也是查看
。所以,你可以把你想要的页眉或页脚任何东西,它会以列表作为一个不可分割的块被滚动。
UPDATE: to add a View
at the top of the list use ListView.addHeaderView(View v)
. Note that, for instance, LinearLayout
is also a View
. So you can put anything you want as a header or a footer and it'll be scrolled with the list as an indivisible block.