gpt4 book ai didi

android - ListView View 回收与 CustomAdapter

转载 作者:行者123 更新时间:2023-11-29 16:05:16 25 4
gpt4 key购买 nike

我正在为 ListView 扩充两种不同的布局。一切正常,直到我开始向下滚动,开始随机应用 2 种不同的布局。我在这里遵循了其他示例,但我无法使其正常工作。有什么建议吗?

public class CustomAdapter extends BaseAdapter {

Date date = new Date();
private OfferList[] offers;
private String nameCompare = "";

CustomAdapter (OfferList[] offers, FetchItemsTask fetchItemsTask) {
this.offers = offers;
}

@Override
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder = null;
LayoutInflater inflater = getLayoutInflater();
if (convertView == null) {
holder = new ViewHolder();
if (nameCompare.equalsIgnoreCase(offers[position].getCustomerName())) {
convertView = inflater.inflate(R.layout.list_offer_group, null);
}
else {
nameCompare = offers[position].getCustomerName();
convertView = inflater.inflate(R.layout.list_offer, null);
}
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.color = (TextView) convertView.findViewById(R.id.color_stock);
holder.time = (TextView) convertView.findViewById(R.id.time);
holder.offerStatus = (TextView) convertView.findViewById(R.id.offer_status);

convertView.setTag(holder);

}
else {
holder = (ViewHolder) convertView.getTag();
}

holder.name.setText(offers[position].getName());
holder.carStockColor.setText(offers[position].getYear() + " " + offers[position].getVehicleMake());
java.util.Date time1 = new java.util.Date(Long.parseLong(offers[position].getModified()));
holder.time.setText(time1.toString().substring(0, 11) + " | ");
holder.offerStatus.setText(offers[position].getStatus());
return convertView;

}

public class ViewHolder {
TextView name;
TextView color;
TextView time;
TextView offerStatus;
}
}

最佳答案

您需要覆盖以下方法:

https://developer.android.com/reference/android/widget/Adapter.html#getViewTypeCount() https://developer.android.com/reference/android/widget/Adapter.html#getItemViewType(int)

这些会让 ListView 知道你有多少种类型的 View ,哪个位置是哪种类型。这将防止 listview 将不正确的 convertview 类型传递给您的 getView 方法。

编辑:

让我们退一步。您看到此问题的原因是 ListView 将不正确的 convertView 传递给您的 getView() 方法。默认的 getViewTypeCount() 返回 1,因此 listView 假定您只有一种 View 类型。您正在为您的行使用两种类型的 View :R.layout.list_offer_group 和 R.layout.list_offer。当 convertView 不为 null 时,您不会检查 convertView 是哪个布局——在某些情况下它将是不正确的布局。

补救措施:

覆盖 getViewTypeCount 以返回 2,因为您有两种不同的类型。覆盖 getItemViewType 以使用您的组/非组逻辑

public int getItemViewType(int position) {
if (nameCompare.equalsIgnoreCase(offers[position].getCustomerName())) {
return 0;
} else {
return 1;
}
}

这现在为组返回 0,为非组返回 1。然后我们可以在 getView 中使用 getItemViewType() 来确定我们使用的是哪个 View ,所以:

        if (nameCompare.equalsIgnoreCase(offers[position].getCustomerName())) {
convertView = inflater.inflate(R.layout.list_offer_group, null);
}
else {
nameCompare = offers[position].getCustomerName();
convertView = inflater.inflate(R.layout.list_offer, null);
}

变成:

        if (getItemViewType(position) == 0) {
convertView = inflater.inflate(R.layout.list_offer_group, null);
}
else {
nameCompare = offers[position].getCustomerName();
convertView = inflater.inflate(R.layout.list_offer, null);
}

这应该可以修复您的行为,因为现在 ListView 知道您有 2 种 View 类型 (getViewTypeCount) 以及列表中的哪些行属于哪种类型 (getItemViewType)。它将不再将组类型的 convertView 传递到非组类型行的 getView 调用中,反之亦然。

关于android - ListView View 回收与 CustomAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19366882/

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