1

我正在为 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;
    }
 }
4

1 回答 1

4

您需要覆盖以下方法:

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

这些将使列表视图知道您拥有多少种视图类型以及哪个位置属于哪种类型。这将防止列表视图将不正确的转换视图类型传递给您的 getView 方法。

编辑:

让我们退后一步。您看到此问题的原因是 ListView 将不正确的 convertView 传递给您的 getView() 方法。默认的 getViewTypeCount() 返回 1,因此 listView 假定您只有一种视图类型。您正在为行使用两种类型的视图: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() 来确定我们使用的是哪个视图,所以:

        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 种视图类型 (getViewTypeCount) 以及列表中的哪些行属于哪种类型 (getItemViewType)。它不再将 group 类型的 convertView 传递给非 group 类型的行的 getView 调用,反之亦然。

于 2013-10-14T18:46:27.120 回答