项目作者: hehonghui

项目描述 :
通用的ListView、RecyclerView的Adapter
高级语言: Java
项目地址: git://github.com/hehonghui/commonadapter.git
创建时间: 2015-09-28T09:01:53Z
项目社区:https://github.com/hehonghui/commonadapter

开源协议:MIT License

下载


Android Common Adapter

该库用于简化AbsListView类型与RecyclerView的Adapter构建,在ListViewAdapter和RecyclerAdapter封装了固定的业务逻辑,使得用户只需要实现变化的部分即可,简化代码,避免重复的模板代码。

该库的接口参考了base-adapter-helper,在此基础上添加了RecyclerView Adapter的支持。两种类型的Adapter之间通过桥接模式简化代码,参考ViewHolderImpl

添加Gradle依赖

在项目的build.gradle中添加上如下依赖:

  1. dependencies {
  2. // 其他依赖
  3. // Common Adapter的依赖
  4. compile 'org.simple:adapter:1.0.1'
  5. }

1、使用代码

  1. /**
  2. * 初始化ListView
  3. */
  4. private void initListView() {
  5. ListView listView = (ListView) findViewById(R.id.listview);
  6. final ListViewAdapter<String> adapter = new ListViewAdapter<String>(R.layout.list_item_type_1) {
  7. @Override
  8. protected void onBindData(GodViewHolder viewHolder, int position, String item) {
  9. viewHolder
  10. .setText(R.id.textview, item) // 设置文本内容
  11. .setImageResource(R.id.imageview, R.drawable.big_smile) ; // 设置图片资源
  12. }
  13. };
  14. // 添加数据
  15. adapter.addItems(mockDatas());
  16. listView.setAdapter(adapter);
  17. // 设置ListView的点击事件
  18. listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  19. @Override
  20. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  21. Toast.makeText(MainActivity.this, "Click List : " + adapter.getItem(position), Toast.LENGTH_SHORT).show();
  22. }
  23. });
  24. }

针对于AbsListView类族的组件需要使用ListViewAdapter类型的Adapter,泛型参数就是单个实体类的数据类型。在构造ListViewAdapter对象时覆写onBindData函数完成数据的绑定即可。GodViewHolder中包含了各类View属性的设置,具体请直接查看GodViewHolder中的setter函数。

对于RecyclerView则需要使用RecyclerAdapter,使用方式与ListViewAdapter类似,示例代码如下所示。

  1. /**
  2. * 初始化RecyclerView
  3. */
  4. private void initRecyclerView() {
  5. RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
  6. // 线性
  7. recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
  8. // 初始化adapter
  9. final RecyclerAdapter<String> adapter = new RecyclerAdapter<String>(R.layout.list_item_type_1, mockDatas()) {
  10. @Override
  11. protected void onBindData(RecyclerViewHolder viewHolder, int position, String item) {
  12. viewHolder.setText(R.id.textview, item);
  13. ImageView imageView = viewHolder.findViewById(R.id.imageview);
  14. Glide
  15. .with(viewHolder.getContext())
  16. .load("http://img4.duitang.com/uploads/blog/201402/19/20140219232639_Cda2j.thumb.600_0.jpeg")
  17. .into(imageView);
  18. }
  19. // 如果有多个布局,那么覆写getItemViewType与getItemLayout即可
  20. @Override
  21. public int getItemViewType(int position) {
  22. return position % 5 == 0 ? 2 : 1;
  23. }
  24. @Override
  25. protected int getItemLayout(int type) {
  26. if (type == 2) {
  27. return R.layout.list_item_type_2;
  28. }
  29. return R.layout.list_item_type_1;
  30. }
  31. };
  32. // 设置RecyclerView的点击事件
  33. adapter.setOnItemClickListener(new RecyclerAdapter.OnItemClickListener() {
  34. @Override
  35. public void onItemClick(int position) {
  36. Toast.makeText(MainActivity.this, "Click Recycler : "
  37. + adapter.getItem(position), Toast.LENGTH_SHORT).show();
  38. }
  39. });
  40. recyclerView.setAdapter(adapter);
  41. }

在使用Common Adapter时不需要担心数据源发生改变导致列表数据不更新的问题,因为Adapter基类中将数据集设置为final,所有的数据都会添加到该数据集中;在增加、减少数据时也不需要调用notifyDataSetChanged,只需要调用Adapter对应的的addItem或者remove函数即可。

2、效果