BaseAdapter获取View之三重境界

在BaseAdapter获取View之前,BaseAdapter需要与数据源相关联。

可以使用构造方法:

   private List<ItemBean> baseListItems;
   private LayoutInflater mInflate;      //布局装载器
   public MyBaseAdapter(Context context,List<ItemBean> listItems){
    baseListItems = listItems;      //将数据源与数据适配器关联
    mInflate = LayoutInflater.from(context);      //初始化布局装载器
}

 

BaseAdapter获取View分三种:逗比式,普通式,文艺式。

逗比式:需要多次新建View,没有充分利用列表组件(ListView,GridView)的缓冲机制,有浪费很大资源的嫌疑。

  @Override
  public View getView(int i, View convertView, ViewGroup viewGroup) {
     View view = mInflate.inflate(R.layout.simple_item, null);    //重复新建View.其中mInflate 为布局装载器,可从要使用的当前的Adapter的界面对象获得.
     ImageView imageView = (ImageView) view.findViewById(R.id.header);
     TextView personName = (TextView) view.findViewById(R.id.personName);
     TextView desc = (TextView) view.findViewById(R.id.desc);
     //创建列表项对应的Bean对象
     BaseItemBean itemBean = baseListItems.get(i);
     //给个组件赋值
     imageView.setImageResource(itemBean.Header);
     personName.setText(itemBean.PersonName);
     desc.setText(itemBean.Desc);
     return view;
  }   

普通式:利用了ListView的缓存机制。

@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
    if (convertView == null) {        //判断缓存池中是否有当前列表项布局对应的view,当为null时,使用布局装载器转换,否则直接使用
        convertView = mInflate.inflate(R.layout.simple_item, null);      //避免了重复的创建大量的convertView.
    }
    ImageView imageView = (ImageView) convertView.findViewById(R.id.header);
    TextView personName = (TextView) convertView.findViewById(R.id.personName);
    TextView desc = (TextView) convertView.findViewById(R.id.desc);
    //创建列表项对应的Bean对象
    BaseItemBean itemBean = baseListItems.get(i);
    //给个组件赋值
    imageView.setImageResource(itemBean.Header);
    personName.setText(itemBean.PersonName);
    desc.setText(itemBean.Desc);
    return convertView;
  }

文艺式:在普通式中,虽然利用了listView的缓存机制,避免了convertView的重复创建,但仍然存在多个findViewByID() 操作,浪费了大量的资源,为了避免此情况,使用内部类ViewHolder。。。

  @Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
      
      ViewHolder viewHolder;
      if (convertView == null) {
    convertView = mInflate.inflate(R.layout.simple_item, null);
    viewHolder = new ViewHolder(); //初始化ViewHolder
    //在创建完convertView后将列表项中的各组件保存到ViewHolder中
    viewHolder.Header = (ImageView) convertView.findViewById(R.id.header);
    viewHolder.PersonName = (TextView) convertView.findViewById(R.id.personName);
    viewHolder.Desc = (TextView) convertView.findViewById(R.id.desc);
    //通过setTag将ViewHolder与convertView绑定
    convertView.setTag(viewHolder);
    }else {
    //当convertVIew不为空时,通过getTag获取ViewHolder对象
    viewHolder = (ViewHolder) convertView.getTag();

    }
    //给convertView个组件赋值
     BaseItemBean itemBean = baseListItems.get(i);
    viewHolder.Header.setImageResource(R.mipmap.ic_launcher);
    viewHolder.PersonName.setText(itemBean.PersonName);
    viewHolder.Desc.setText(itemBean.Desc);
    return convertView;
}
    //创建内部类ViewHolder,需要类中的各变量与列表项的各单元组件相对应
    public class ViewHolder{
    public ImageView Header;
    public TextView PersonName;
    public TextView Desc;
    }  
总结:在开发过程中,应尽量使用文艺式,这样有利于充分利用资源,同事优化了开发效率。




转载于:https://www.cnblogs.com/shymain-123/p/shymain_123.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BaseAdapter是Android开发中的一个抽象类,用于创建自定义适配器。适配器是连接数据和UI界面的桥梁,它负责将数据源中的数据逐个绑定到UI组件上,以展示给用户。BaseAdapter提供了一些方法,可以帮助我们实现自定义适配器。 以下是一个使用BaseAdapter创建自定义适配器的示例代码: ```java public class MyAdapter extends BaseAdapter { private Context mContext; private List<String> mData; public MyAdapter(Context context, List<String> data) { mContext = context; mData = data; } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.item_layout, parent, false); holder = new ViewHolder(); holder.textView = convertView.findViewById(R.id.text_view); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } String item = mData.get(position); holder.textView.setText(item); return convertView; } private static class ViewHolder { TextView textView; } } ``` 在这个示例中,我们创建了一个名为MyAdapter的自定义适配器,继承自BaseAdapter。在构造方法中,我们传入了上下文和数据源。然后,我们实现了BaseAdapter的四个方法:getCount()、getItem()、getItemId()和getView()。 - getCount()方法返回数据源的大小。 - getItem()方法返回指定位置的数据项。 - getItemId()方法返回指定位置的数据项的ID。 - getView()方法用于创建每个列表项的视图,并将数据绑定到视图上。 在getView()方法中,我们使用了ViewHolder模式来优化列表项的创建和复用。通过convertView参数判断是否需要创建新的视图,如果convertView为null,则创建新的视图,并将其缓存到ViewHolder中;如果convertView不为null,则直接从缓存中获取ViewHolder。然后,我们从数据源中获取对应位置的数据项,并将其绑定到视图上。 这样,我们就可以使用自定义的适配器MyAdapter来展示数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值