gpt4 book ai didi

android - 计算ListView每一行的高度

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:31:05 24 4
gpt4 key购买 nike

我正在尝试使 ListView 的背景与 ListView 一起滚动。我的方法基于 Shelves 中的此类,但在 Shelves 中,所有东西都具有相同的高度,我无法做出相同的保证。

我有这样的 Activity :

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
}
}

我想要做的是用 View 行的高度填充适配器中的 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(),我得到非零但不是真实高度的东西。如果我向下滚动然后再次向上滚动(将其中一行移出 View )getHeight() == getMeasuredHeight() 并且两者都具有正确的值。如果我只是在 getView 中更新 mHeights(通过说 mHeights.set(position, row.getHeight()));它会起作用——但只有在我滚动到 ListView 的底部之后。我试过在 getView 方法中调用 row.measure(),但这仍然会导致 getHeight() 在第一次运行时为 0。

我的问题是:如何使用 ListView 行的正确高度计算和填充 mHeights?我见过一些类似的问题,但它们似乎不是我要找的。 ViewTreeObserver 方法似乎很有前途,但我不知道如何从中强制调用 getView()(或者,迭代 ListView 的行)。调用 adapter.notifyDataSetChanged() 会导致无限(尽管是非阻塞)循环。

  1. Get Actual Height of View
  2. how to get height of the item in a listview?

这与我之前关于该主题的问题有关,似乎没有捕获要点:ListView distance from top of the list

最佳答案

我想出了如何做到这一点。这有点棘手,但它确实有效。

微妙之处在于在知道布局参数时获取布局参数。据我所知,getView() 是在初始时间返回 View ,所以它当然还不能有高度——父级还不知道该行(因为 getView() 的工作是膨胀它),所以我们需要一个回调。

回调可能是什么?结果,据我所知,它是行 View 的 OnLayoutChangeListener()。因此,在我自定义的 ArrayAdapter 中的 getView() 中,我为 onLayoutChanged 添加了一个回调,如下所示:

row.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
public void onLayoutChange(View v, int left, int top, int right,
int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
ref.removeOnLayoutChangeListener(this);
Log.d("CustomArrayAdapter", "onLayoutChange(" + position + "): height " + (bottom - top));
mHeights.set(position, (bottom - top));
if(position > 0) {
mDistances.set(position, bottom - top + mDistances.get(position-1) + ((ListView)parent).getDividerHeight());
}
holderRef.distanceFromTop = mDistances.get(position);
Log.d("CustomArrayAdapter", "New height for " + position + " is " + mHeights.get(position) + " Distance: " + mDistances.get(position));
}
});

这里,row是适配器中getView()要返回的 View ,mHeights是每个高度的列表ListView 的元素,而 mDistances 是一个距离 ListView 顶部的距离列表,以像素为单位 - 我想要计算的真实事物(也就是说,如果你把整个 ListView 从头到尾布置好,我离顶部元素有多远)。所有这些都存储在自定义 ArrayAdapter 中。这些列表被初始化为零。

添加此回调允许我计算 View 的高度。

我的目标是让 ListView 的背景随列表一起滚动。如果有人有兴趣,如果有人想查看它,我会把代码放在 GitHub 上:https://github.com/mdkess/TexturedListView

关于android - 计算ListView每一行的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13131948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com