我正在尝试使用 ListView 滚动 ListView 的背景。我的方法基于 Shelves 中的这门课,但是在Shelves中,所有东西都具有相同的高度,但我无法做出相同的保证。
我有这样的活动:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.listView);
List<String> items = new ArrayList<String>();
for(int i=0; i < 100; ++i) {
items.add("Hello " + i);
}
CustomArrayAdapter adapter = new CustomArrayAdapter(this, items);
listView.setAdapter(adapter);
}
}
CustomArrayAdapter 在哪里:
public class CustomArrayAdapter extends ArrayAdapter<String> {
private List<Integer> mHeights;
public View getView(int position, View convertView, ViewGroup parent) {
//snip
}
}
我想要做的是用视图行的高度填充适配器中的 mHeights。
我的主要尝试是在 getView() 中这样做:
if(row.getMeasuredHeight() == 0) {
row.measure(
MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY));
}
mHeights.set(position, row.getMeasuredHeight());
我已经尝试了几种方法来做到这一点,但我无法得到任何工作。
在getView
中,如果我打电话,getHeight()
我会得到一个返回值 0,而如果我打电话getMeasuredHeight()
,我会得到一些非零但不是真实高度的东西。如果我向下滚动然后再次向上滚动(将其中一行移出视图)getHeight() == getMeasuredHeight()
并且两者都有正确的值。如果我只是更新 getView 中的 mHeights (通过说mHeights.set(position, row.getHeight()
);它有效 - 但只有在我滚动到 ListView 的底部之后。我尝试在 getView 方法中调用 row.measure() ,但这仍然会导致getHeight()
第一次运行时为 0。
我的问题是:如何计算并使用 ListView 行的正确高度填充 mHeights?我见过一些类似的问题,但它们似乎不是我要找的。该ViewTreeObserver
方法似乎很有希望,但我不知道如何强制调用 getView() (或者,迭代 ListView 的行)。调用adapter.notifyDataSetChanged()
会导致无限(尽管非阻塞)循环。
这与我之前关于该主题的问题有关,似乎没有抓住重点:ListView distance from the top of the list