1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/i-android-android-adapter

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Android-адаптер

Android-адаптер — это минималистичный адаптер, который поддерживает list-adapter, expandable-list-adapter и recycler-adapter. С его помощью можно легко создавать адаптеры одного или нескольких типов.

Gradle-конфигурация:

  • compile 'cn.yhq:android-adapter:1.4.0'
  • compile 'cn.yhq:android-recycler-adapter:1.4.0'

Использование:

1. Создание простейшего адаптера (одного типа)

#####(1) Для данных, подобных List (одиночный список, подходящий для ListView или GridView), используйте SimpleListAdapter. Пример кода:

SimpleListAdapter<String> adapter = SimpleListAdapter.create(this, getDatas(), R.layout.layout_item1,
        new SimpleListAdapter.IItemViewSetup<String>() {
            @Override
            public void setupView(ViewHolder viewHolder, int position, String entity) {
                viewHolder.bindTextData(R.id.item_text, entity);
            }
        });

#####(2) Для данных, подобных List<List> (вложенный список, подходящий для ExpandableListView), используйте SimpleExpandableListAdapter. Пример кода:

 SimpleExpandableListAdapter<Group, Child> adapter =
        SimpleExpandableListAdapter.create(this, getDatas(), R.layout.layout_item1, R.layout.layout_item1, new SimpleExpandableListAdapter.IItemViewSetup<Group, Child>() {
            @Override
            public void setupGroupView(ViewHolder viewHolder, int position, Group entity, boolean isExpanded) {
                viewHolder.bindTextData(R.id.item_text, entity.text);
            }
    
            @Override
            public void setupChildView(ViewHolder viewHolder, int groupPosition, Group groupEntity, int childPosition, Child childEntity) {
                viewHolder.bindTextData(R.id.item_text, childEntity.text);
            }
    
            @Override
            public Child getChild(Group group, int childPosition) {
                return group.childs.get(childPosition);
            }
    
            @Override
            public int getChildrenCount(Group group) {
                return group.childs.size();
            }
        });

#####(3) Для адаптера RecyclerView используйте SimpleRecyclerListAdapter. Пример кода:

 SimpleRecyclerListAdapter<String> adapter = SimpleRecyclerListAdapter.create(this, getDatas(),
        R.layout.layout_item1, new SimpleRecyclerListAdapter.IItemViewSetup<String>() {
          @Override
          public void setupView(cn.yhq.adapter.recycler.ViewHolder viewHolder, int position,
              String entity) {
            viewHolder.bindTextData(R.id.item_text, entity);
          }
        });

#####(4) Конечно, если вы не хотите использовать встроенные Simple**Adapter, вы можете использовать соответствующие ListAdapter, BaseExpandableListAdapter и RecyclerListAdapter для создания собственного адаптера. #####(5) Если ваш тип данных отличается от List, например, JsonArray или Object {List}, вам нужно будет наследовать BaseAdapter<L, I>, BaseExpandableAdapter<L, G, C> и RecyclerBaseAdapter<L, I> для создания своего собственного адаптера. Вот пример пользовательского ListAdapter:

 public class ListObjectAdapter extends BaseAdapter<ListObject, String> {
    
        public ListObjectAdapter(Context context, ListObject listData) {
            super(context, listData);
        }
    
        public ListObjectAdapter(Context context) {
            super(context);
        }
    
        @Override
        protected ListObject newInstance() {
            return new ListObject();
        }
    
        @Override
        public void clearAllItem() {
    
        }
    
        @Override
        public void addAllItem(ListObject items) {
    
        }
    
        @Override
        public void addItem(String item) {
    
        }
    
        @Override
        public void removeItem(String item) {
    
        }
    
        @Override
        public void removeItem(int position) {
    
        }
    
        @Override
        public int getCount() {
            return 0;
        }
    
        @Override
        public String getItem(int position) {
            return null;
        }
    }

    public class ListObject {
        public List<String> list;
    }

2. Создание многотипного адаптера

  • Здесь в качестве примера используется ListAdapter. ExpandableListAdapter и RecyclerAdapter похожи.
  • Многотипный адаптер создаётся путём регистрации различных типов представлений, а затем выбора соответствующего представления на основе позиции и сущности для рендеринга и привязки данных. Существует два способа создания адаптера с несколькими типами:
  1. На основе ключа: адаптер регистрирует соответствующий тип view-провайдера на основе значения ключа. Также необходимо установить стратегию выбора ключа для view-провайдеров, чтобы определить, какой view-провайдер использовать для рендеринга каждого элемента.

Пример кода:

public class MutipleTypeListAdapter1 extends ListAdapter<MutipleTypeObject> {
  public final static int TYPE_1 = 1;
  public final static int TYPE_2 = 2;

  public MutipleTypeListAdapter1(Context context) {
    super(context);
    // Регистрация типа 1 view-провайдера
    this.register(TYPE_1, new ItemViewProvider1<MutipleTypeObject>() {
      @Override
      public int getItemViewLayoutId() {
        return R.layout.layout_item1;
      }

      @Override
      public void setupView(ViewHolder viewHolder, int position, MutipleTypeObject entity) {
        viewHolder.bindTextData(R.id.item_text, entity.text);
      }
    });
    // Регистрация типа 2 view-провайдера
    this.register(TYPE_2, new ItemViewProvider1<MutipleTypeObject>() {
      @Override
      public int getItemViewLayoutId() {
        return R.layout.layout_item2;
      }

      @Override
      public void setupView(ViewHolder viewHolder, int position, MutipleTypeObject entity) {
        viewHolder.bindTextData(R.id.item_text, entity.text);
      }
    });
    // Установка стратегии выбора ключа view-провайдера
    this.setItemViewProviderKeyPolicy(new IItemViewProviderKeyPolicy<MutipleTypeObject>() {
      @Override
      public int getItemViewProviderKey(int position, MutipleTypeObject entity) {
        if (entity.type == MutipleTypeObject.TYPE_1) {
          return TYPE_1;
        } else if (entity.type == MutipleTypeObject.TYPE_2) {
          return TYPE_2;
        }
        return -1;
      }
    });
  }
}
  1. На основе селектора: адаптер регистрирует view-провайдеры на основе селекторов. В этом случае необходимо реализовать метод isForProvider, который определяет, должен ли текущий view-провайдер использоваться для рендеринга элемента.

Пример кода:

public class MutipleTypeListAdapter2 extends ListAdapter<MutipleTypeObject> {

  public MutipleTypeListAdapter2(Context context) {
    super(context);
    // Регистрация type 1 view-провайдера
    this.register(new ItemViewProvider2<MutipleTypeObject>() {
      @Override
      public boolean isForProvider(int position, MutipleTypeObject entity) {
        return entity.type == MutipleTypeObject.TYPE_1;
      }

      @Override
      public int getItemViewLayoutId() {
        return R.layout.layout_item1;
      }

      @Override
      public void setupView(ViewHolder viewHolder, int position, MutipleTypeObject entity) {
        viewHolder.bindTextData(R.id.item_text, entity.text);
      }
    });
    // Регистрация type 2 view-провайдера
    this.register(new ItemViewProvider2<MutipleTypeObject>() {
      @Override
      public boolean isForProvider(int position, MutipleTypeObject entity) {
        return entity.type == MutipleTypeObject.TYPE_2;
      }

      @Override
      public int getItemViewLayoutId() {
        return R.layout.layout_item2;
      }

      @Override
      public void setupView(ViewHolder viewHolder, int position, MutipleTypeObject entity) {
        viewHolder.bindTextData(R.id.item_text, entity.text);
      }
    });
  }
}

Третий способ более эффективен, чем второй, так как во втором способе происходит перебор элементов, что может снизить производительность. Если количество типов элементов велико, рекомендуется использовать первый способ регистрации view-провайдеров.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/i-android-android-adapter.git
git@api.gitlife.ru:oschina-mirror/i-android-android-adapter.git
oschina-mirror
i-android-android-adapter
i-android-android-adapter
master