文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1.5 Adapter 模板
我在进行重构的时候还发现,如果不对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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论