viewholder 导致第一个视图项错误显示和一些视图飞溅

viewholder caused the first view item wrongly displaying and some of views splashing

我发现了 Android BaseAdapter viewHolder 的问题。像这样:我使用 viewholder 总是导致第一个视图项错误显示。就像第一个项目视图飞溅或某些视图飞溅一样。 大多数问题是在低 OS Android 设备中引起的。 我不知道为什么。但我停止使用 viewHolder 解决了这个问题。
为什么?

public class TreasureBoxAdapter extends BaseTreasureBoxAdapter {
private static final String TAG = "TreasureBoxAdapter";
private static final boolean DEBUG = FeatureConfig.DEBUG_LOG;

private final AbsListView.LayoutParams param;
private final int mViewHolderHeight;

public TreasureBoxAdapter(Context context, List<?> items, int columnCount, int mScreenWidth) {
    super(context, items, columnCount);
    mViewHolderHeight = mScreenWidth / context.getResources().getInteger(R.integer.column_count);
    param = new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            mScreenWidth / context.getResources().getInteger(R.integer.column_count));
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
      if (convertView == null) {
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.treasure_box_grid_item, null);
        holder = new ViewHolder(convertView);
        convertView.setTag(holder);
      } else {
          holder = (ViewHolder) convertView.getTag();
      }
    holder.build(position);

    holder.item.setLayoutParams(param);
    return convertView;
}

public class ViewHolder extends TreasureViewHolder{

    public ViewHolder(View view) {
        item = (LinearLayout) view.findViewById(R.id.treasure_item);
        title = (TextView) view.findViewById(R.id.item_title);
        image = (ImageView) view.findViewById(R.id.item_img);
        remind = new RemindView(getContext(), image);
    }

    @Override
    public void build(int pos) {
        TreasureBean item = (TreasureBean) getItem(pos);
        item.buildView(getContext(), this, pos);
    }
}

使用 RecyclerView 而不是 ListView 并在您的适配器中扩展 RecyclerView.Adapter,这将起作用。例如

public class YourAdapterName extends         
RecyclerView.Adapter<YourAdapterName.MyViewHolder> {
}