返回介绍

1.5 Adapter 模板

发布于 2024-08-17 23:46:12 字数 2573 浏览 0 评论 0 收藏 0

我在进行重构的时候还发现,如果不对Adapter的写法进行规范,开发人员还是会根据自己的习惯,写出来各种各样的Adapter,比如:

·很多开发人员都喜欢将Adapter内嵌在Activity中,一般会使用SimpleAdapter。

·由于没有使用实体,所以一般会把一个字典作为构造函数的参数注入到Adapter中。

而我希望Adapter只有一种编码风格,这样发现了问题也很容易排查。

于是我们要求所有的Adapter都继承自BaseAdapter,从构造函数注入List<自定义实体>这样的数据集合,从而完成ListView的填充工作,如下所示:

public class CinemaAdapter extends BaseAdapter {
  private final ArrayList<CinemaBean> cinemaList;
  private final AppBaseActivity context;
  public CinemaAdapter(ArrayList<CinemaBean> cinemaList, 
      AppBaseActivity context) {
    this.cinemaList = cinemaList;
    this.context = context;
  }
  public int getCount() {
    return cinemaList.size();
  }
  public CinemaBean getItem(final int position) {
    return cinemaList.get(position);
  }
  public long getItemId(final int position) {
    return position;
  }

对于每个自定义的Adapter,都要实现以下4个方法:

·getCount()

·getItem()

·getItemId()

·getView()

此外,还要内置一个Holder嵌套类,用于存放ListView中每一行中的控件。ViewHolder的存在,可以避免频繁创建同一个列表项,从而极大地节省内存,如下所示:

class Holder {
  TextView tvCinemaName;
  TextView tvCinemaId;
}

你可能会觉得我老生常谈,但当有很多列表数据时,快速滑动列表会变得很卡,其实就是因为没有使用ViewHolder机制导致的,正确的写法如下所示:

public View getView(final int position, View convertView, 
    final ViewGroup parent) {
  final Holder holder;
  if (convertView == null) {
    holder = new Holder();
    convertView = context.getLayoutInflater().inflate(
        R.layout.item_cinemalist, null);
    holder.tvCinemaName = (TextView) convertView.
        findViewById(R.id.tvCinemaName);
    holder.tvCinemaId = (TextView) convertView.
        findViewById(R.id.tvCinemaId);
    convertView.setTag(holder);
  } else {
    holder = (Holder) convertView.getTag();
  }
  CinemaBean cinema = cinemaList.get(position);
  holder.tvCinemaName.setText(cinema.getCinemaName());
  holder.tvCinemaId.setText(cinema.getCinemaId());
  return convertView;
}

那么,在Activity中,在使用Adapter的地方,我们按照下面的方式把列表数据传递过去:

@Override
Protected void initViews(Bundle savedlnstanceState) {
  setContentView(R.layout.activity_listdemo);
  lvCinemaList = (ListView) findViewByld(R.id. lvCinemalist);
  CinemaAdapter adapter = new CinemaAdapter(cinemaList, ListDemoActivity.this);
  lvCinemaList.setAdapter(adapter);
  lvCinemaList.setOnItemClickListener(
    new AdapterView.OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> parent, 
          View view, int position, long id) {
        // do something
      }
    });
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文