如何使用视图持有者模式制作自定义适配器?

How to make custom adapter with view holder pattern?

我有这个用于图像的自定义适配器,我想更改它以使其内部具有视图支架图案。任何人都可以帮助弄清楚如何更改我的代码,以便在可能的情况下在其中包含 View Holder 模式吗?

public class ImageAdapter extends BaseAdapter {

private final int imageTotal;
private ArrayList<String> urlList = new ArrayList<>();
private final Context mContext;

public ImageAdapter(Context context, ArrayList<String> uList) {
    mContext = context;
    urlList = uList;
    imageTotal = uList.size();
}

public int getCount() {
    return imageTotal;
}

@Override
public String getItem(int position) {
    return urlList.get(position);
}

public long getItemId(int position) {
    return 0;
}

public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;
    if (convertView == null) {
        imageView = new ImageView(mContext);
        imageView.setAdjustViewBounds(true);
    } else {
        imageView = (ImageView) convertView;
    }
    String url = getItem(position);

    Picasso.with(mContext)
            .load(url)
            .placeholder(R.drawable.loader)
            .fit()
            .into(imageView);
    return imageView;
}

}

您仅将视图用作 ImageView,因此 ViewHolder 模式没有意义。

但是假设您需要向视图添加一个 TextView,因此您需要创建一个自定义布局文件,其中包含一个 ImageView(我们将其 id 定义为 R.id.image)和一个 TextView(我们将其定义为ID 为 R.id.text).

因此您的代码将如下所示:(我将省略未更改的部分)

public class ImageAdapter extends BaseAdapter {

    static class ViewHolder {
        ImageView image;
        TextView text;

        ViewHolder(View v) {
            image = v.findViewById(R.id.image);
            text = v.findViewById(R.id.text);
        }
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        String url = getItem(position);

        Picasso.with(mContext)
                .load(url)
                .placeholder(R.drawable.loader)
                .fit()
                .into(viewHolder.image);
        viewHolder.text.setText("my text");
        return imageView;
    }
}

ViewHolder 背后的想法是避免重新绑定。分离行为也很有用。

但正如@cricket_007 评论的那样,您应该使用 RecyclerView,它使您有义务使用 ViewHolder :)