Android-адаптер — это минималистичный адаптер, который поддерживает list-adapter, expandable-list-adapter и recycler-adapter. С его помощью можно легко создавать адаптеры одного или нескольких типов.
compile 'cn.yhq:android-adapter:1.4.0'
compile 'cn.yhq:android-recycler-adapter:1.4.0'
#####(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;
}
Пример кода:
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;
}
});
}
}
Пример кода:
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 )