BaseAdapter的getView()与ViewHolder的两种写法-更深刻理解ViewHolder

  • 普通android基础书上都会写这种:
private class HomeAdapter extends BaseAdapter{

        ......

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view;
            ViewHolder holder;
            if(convertView==null){
                view=View.inflate(UiUtils.getContext(), R.layout.item_app, null);
                holder=new ViewHolder();

                holder.item_icon=(ImageView) view.findViewById(R.id.item_icon);
                holder.item_title=(TextView) view.findViewById(R.id.item_title);
                holder.item_size=(TextView) view.findViewById(R.id.item_size);
                holder.item_bottom=(TextView) view.findViewById(R.id.item_bottom);
                holder.item_rating=(RatingBar) view.findViewById(R.id.item_rating);
                view.setTag(holder);
            }else{
                view=convertView;
                holder=(ViewHolder) view.getTag();
            }

            AppInfo appInfo=datas.get(position);
            holder.item_title.setText(appInfo.getName());// 设置应用程序的名字
            String size=Formatter.formatFileSize(UiUtils.getContext(), appInfo.getSize());
            holder.item_size.setText(size);
            holder.item_bottom.setText(appInfo.getDes());
            float stars = appInfo.getStars();
            holder.item_rating.setRating(stars); // 设置ratingBar的值
            String iconUrl = appInfo.getIconUrl();  //http://127.0.0.1:8090/image?name=app/com.youyuan.yyhl/icon.jpg

            // 显示图片的控件
            bitmapUtils.display(holder.item_icon, HttpHelper.URL+"image?name="+iconUrl);
            return view;
        }

        ......
    }

    static class ViewHolder{
        ImageView item_icon;
        TextView item_title,item_size,item_bottom;
        RatingBar item_rating;
    }
  • 这里给出第二种写法【方便抽取DefaultAdapter和BaseViewHolder进行快速开发】
private class HomeAdapter extends BaseAdapter{

        ......

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            ViewHolder holder;
            if(convertView==null){

                holder=new ViewHolder();

            }else{
                holder=(ViewHolder) convertView.getTag();
            }

            AppInfo appInfo=datas.get(position);
            holder.setData(appInfo);

            return holder.getContentView();
        }

        ......

    }
    static class ViewHolder{
        ImageView item_icon;
        TextView item_title,item_size,item_bottom;
        RatingBar item_rating;

        View contentView;
        AppInfo appInfo;

        public ViewHolder(AppInfo appInfo){
            contentView = initView();
            contentView.setTag(this);
        }

        public void setData(AppInfo appInfo){
            this.appInfo = appInfo;
            refreshView(appInfo);
        }
        public View getContentView(){
            return contentView;
        }
    }

public View initView(){
    View view;
    view = View.inflate(UiUtils.getContext(), R.layout.item_app, null);

    this.item_icon=(ImageView) view.findViewById(R.id.item_icon);
                this.item_title=(TextView) view.findViewById(R.id.item_title);
                this.item_size=(TextView) view.findViewById(R.id.item_size);
                this.item_bottom=(TextView) view.findViewById(R.id.item_bottom);
                this.item_rating=(RatingBar) view.findViewById(R.id.item_rating);

    return view;
}
public void refreshView(AppInfo appInfo){
    this.item_title.setText(appInfo.getName());// 设置应用程序的名字
            String size=Formatter.formatFileSize(UiUtils.getContext(), appInfo.getSize());
            this.item_size.setText(size);
            this.item_bottom.setText(appInfo.getDes());
            float stars = appInfo.getStars();
            this.item_rating.setRating(stars); // 设置ratingBar的值
            String iconUrl = appInfo.getIconUrl();  //http://127.0.0.1:8090/image?name=app/com.youyuan.yyhl/icon.jpg

            // 显示图片的控件
            bitmapUtils.display(this.item_icon, HttpHelper.URL+"image?name="+iconUrl);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是一个适配器中的一个方法,用于绑定数据到视图上。具体解释如下: 1. `BaseViewHolder holder`:这个参数是一个ViewHolder对象,它包含了视图中所有的控件,可以通过它来获取和操作控件。 2. `AppInfoOV packageEntity`:这个参数是一个数据实体对象,包含了展示在这个视图上的所有数据。 3. `int position`:这个参数表示当前视图的位置。 4. `View itemView = holder.getItemView();`:获取当前视图的根View。 5. `itemView.setOnClickListener(this);`:设置当前视图的点击事件监听器为当前适配器对象。 6. `itemView.setTag(position);`:给当前视图设置一个Tag,值为当前视图的位置。 7. `TextView labelView = (TextView) holder.getView(R.id.uninstall_label);`:获取当前视图中id为`uninstall_label`的TextView控件。 8. `Drawable drawable = packageEntity.getIcon();`:从数据实体对象中获取一个Drawable对象。 9. `drawable.setBounds(0, 0, 60, 60);`:设置Drawable对象的边界。 10. `labelView.setCompoundDrawables(drawable, null, null, null);`:设置TextView控件左侧的图标为上一步获取的Drawable对象。 11. `labelView.setText(packageEntity.getLabel());`:设置TextView控件的文本为数据实体对象中的标签。 12. `ProgressBar progressBar = (ProgressBar) holder.getView (R.id.uninstall_package_size_index);`:获取当前视图中id为`uninstall_package_size_index`的ProgressBar控件。 13. `int packageSize = (int) Math.ceil(log2(packageEntity.getUseSize()));`:计算数据实体对象中使用的空间大小,并向上取整。 14. `progressBar.setProgress(packageSize);`:设置ProgressBar控件的进度为上一步计算的大小。 15. `TextView memSizeView = (TextView) holder.getView(R.id.uninstall_package_size);`:获取当前视图中id为`uninstall_package_size`的TextView控件。 16. `memSizeView.setText(ByteUtil.getPrintSize(packageEntity.getUseSize()));`:设置TextView控件的文本为数据实体对象中使用的空间大小转换后的字符串。 17. `CheckBox checkBox = (CheckBox) holder.getView(R.id.uninstall_check_box);`:获取当前视图中id为`uninstall_check_box`的CheckBox控件。 18. `checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {`:设置CheckBox控件的选中状态变化监听器。 19. `datas.get(position).setChecked(isChecked);`:当CheckBox控件的选中状态发生变化时,将数据实体对象中对应位置的isChecked属性设置为变化后的状态。 20. `checkBox.setChecked(datas.get(position).isChecked());`:设置CheckBox控件的选中状态为数据实体对象中对应位置的isChecked属性的值。 21. `if (packageEntity.isThirdPackage() && !packageEntity.isWhiteApp()) { checkBox.setVisibility(View.VISIBLE); }`:如果数据实体对象中表示当前应用是第三方应用,并且不是白名单应用,则显示CheckBox控件。 22. `else { checkBox.setVisibility(View.GONE); }`:否则,隐藏CheckBox控件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值