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

时间:2016-12-10 21:20:29

标签: java android baseadapter android-viewholder

我有这个用于图像的自定义适配器,我想要更改,因此它将在其中具有视图持有者模式。任何人都可以请求帮助弄清楚如何更改我的代码,以便在可能的情况下它将具有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;
}

}

1 个答案:

答案 0 :(得分:2)

您将视图仅用作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:)

相关问题