gpt4 book ai didi

Android ListView LayoutInflater

转载 作者:搜寻专家 更新时间:2023-11-01 08:07:00 26 4
gpt4 key购买 nike

我们目前正在大学里使用 ListView 。我的讲师给了我们一个简单的应用程序,它在列表中显示邮件消息,当用户选择一个时,它会在新 Activity 中显示消息的内容。我几乎了解所有发生的事情,但我想清除一些灰色区域!

基本上我想知道这部分代码的作用是什么?

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.inbox_row, null);
}

此方法位于扩展 ArrayAdapter 的类中。我认为这是某种形式的回收是对的吗? View 何时进入和离开屏幕?....

非常感谢任何帮助。谢谢。

最佳答案

这正是你所说的,一种回收形式。

展开布局需要大量内存和大量时间,因此为了效率起见,系统将刚刚离开屏幕的内容传递给您,您可以简单地更新其文本和图像并将它们返回给 UI .

因此,例如,如果您的 ListView 在其列表中显示 6 个项目(由于它的高度),它只会膨胀 6 个项目,并且在滚动期间它只会继续回收它们。

您应该使用一些额外的优化技巧,我相信评论者发布的视频链接会解释它们。

编辑

该示例是 Store 项目的 ArrayAdapter,但您可以根据需要制作它。适配器负责 UI 和数据之间的匹配和分离层。

@Override
public View getView(int position, View convertView, ViewGroup parent) {

if (convertView == null)
convertView = newView();

// Store is the type of this ArrayAdapter
Store store = getItem(position);
Holder h = (Holder) convertView.getTag();

// And here I get the data and address them to the UI
// as you can see, if the convertView is not null,
// I'm not creating a new one, I'm just changing text, images, etc
h.storeName.setText(store.getStoreName());
h.address.setText(store.getAddressLine1());
h.postcode.setText(store.getPostCode());
h.distance.setText(store.getDistance());

return convertView;
}

// I like to separate in a different method when the convertView is null
// but that's me being organisation obsessive
// but it also makes easy to see which methods are only being called the 1st time
private View newView() {
LayoutInflater inf = LayoutInflater.from(getContext());
View v = inf.inflate(R.layout.map_result_list, null);
Holder h = new Holder();
// here we store that holder inside the view itself
v.setTag(h);

// and only call those findById on this first start
h.storeName = (TextView) v.findViewById(R.id.txtLine1);
h.address = (TextView) v.findViewById(R.id.txtLine2);
h.postcode = (TextView) v.findViewById(R.id.txtLine3);
h.distance = (TextView) v.findViewById(R.id.txtDistance);

return v;
}

// this class is here just to hold reference to the UI elements
// findViewById is a lengthy operation so this is one of the optimisations
private class Holder {
TextView storeName;
TextView address;
TextView postcode;
TextView distance;
}

关于Android ListView LayoutInflater ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13273229/

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