如何使用视图持有者模式制作自定义适配器?
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 :)
我有这个用于图像的自定义适配器,我想更改它以使其内部具有视图支架图案。任何人都可以帮助弄清楚如何更改我的代码,以便在可能的情况下在其中包含 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 :)