首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android TextView inside ListView直到手动滚动后才能测量正确的高度。

在Android开发中,当我们将TextView放置在ListView中时,有时候会遇到一个问题:TextView的高度无法正确测量,直到手动滚动ListView后才能得到正确的高度。

这个问题的原因是ListView的item在初始渲染时,会根据屏幕上可见的item数量进行快速测量和布局,以提高性能。而TextView的高度计算需要根据其内容进行动态调整,因此在初始渲染时无法得到准确的高度。

解决这个问题的方法是通过监听ListView的滚动事件,在滚动结束后重新测量TextView的高度。具体步骤如下:

  1. 在ListView的适配器中,为每个TextView设置一个全局变量用于保存其高度。
  2. 在getView()方法中,为每个TextView设置一个OnGlobalLayoutListener监听器,用于在布局完成后获取其高度。
  3. 在OnGlobalLayoutListener的onGlobalLayout()方法中,获取TextView的高度并保存到全局变量中。
  4. 在ListView的OnScrollListener中,监听滚动事件,在滚动结束后重新测量TextView的高度。

以下是一个示例代码:

代码语言:txt
复制
public class MyAdapter extends BaseAdapter {
    private List<String> data;
    private int[] textHeights;

    public MyAdapter(List<String> data) {
        this.data = data;
        textHeights = new int[data.size()];
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
            holder = new ViewHolder();
            holder.textView = convertView.findViewById(R.id.text_view);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.textView.setText(data.get(position));
        holder.textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                textHeights[position] = holder.textView.getHeight();
                holder.textView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        });

        return convertView;
    }

    public int getTextHeight(int position) {
        return textHeights[position];
    }

    private static class ViewHolder {
        TextView textView;
    }
}

public class MainActivity extends AppCompatActivity {
    private ListView listView;
    private MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = findViewById(R.id.list_view);
        List<String> data = new ArrayList<>();
        // 添加数据到data中
        adapter = new MyAdapter(data);
        listView.setAdapter(adapter);
        listView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                if (scrollState == SCROLL_STATE_IDLE) {
                    // 滚动结束后重新测量TextView的高度
                    int firstVisiblePosition = listView.getFirstVisiblePosition();
                    int lastVisiblePosition = listView.getLastVisiblePosition();
                    for (int i = firstVisiblePosition; i <= lastVisiblePosition; i++) {
                        View view = listView.getChildAt(i - firstVisiblePosition);
                        if (view != null) {
                            int position = i;
                            int height = adapter.getTextHeight(position);
                            TextView textView = view.findViewById(R.id.text_view);
                            textView.setHeight(height);
                        }
                    }
                }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            }
        });
    }
}

在上述代码中,我们通过自定义适配器MyAdapter来管理TextView的高度。在getView()方法中,我们为每个TextView设置了一个OnGlobalLayoutListener监听器,在布局完成后获取其高度并保存到全局变量textHeights中。在ListView的OnScrollListener中,我们监听滚动事件,在滚动结束后重新测量TextView的高度并设置。

这样,当ListView滚动时,TextView的高度就能正确地被测量和设置了。

推荐的腾讯云相关产品:腾讯云移动应用分析(MTA),该产品提供了丰富的移动应用数据分析功能,可帮助开发者深入了解用户行为和应用性能,优化应用体验。产品介绍链接地址:https://cloud.tencent.com/product/mta

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券