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