有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有这个自定义的图像适配器,我想更改它,使其内部有视图保持器模式。如果可能的话,谁能帮我弄清楚如何修改我的代码,使其具有视图持有者模式

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) 个答案

  1. # 1 楼答案

    您使用的视图只是一个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,这使您有义务查看持有者:)