我想知道如何更有效地重用某些代码来显示一个适应getView()[BaseAdapter],onBindView()[RecyclerView]或onCreateView()[Fragment]的视图填充视图?
自定义RecyclerView适配器,用于填充整个cardViews列表
@Override
public void onBindViewHolder(ViewHolder viewHolder, final int i) {
MyThing thing = things.get(i);
/* Repeatable Code */
if (thing.getIcon() == 0) {
viewHolder.thingIcon.setImageResource(0);
} else {
viewHolder.thingIcon.setImageResource(ThingIconSet
.getIconResId(thing.getIcon()));
}
etc..etc..etc
现在我还想以完全相同的方式在此适配器外部填充单个cardView,而不保留此布局的两个副本,您建议我做什么?
SingleItemFragment显示来自适配器或其他任何地方的单个项目
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflating the root view
View rootView = inflater.inflate(R.layout.single_cardview_layout,
container, false);
/* Repeated Code */
if (thing.getIcon() == 0) {
viewHolder.thingIcon.setImageResource(0);
} else {
viewHolder.thingIcon.setImageResource(ThingIconSet
.getIconResId(thing.getIcon()));
}
谢谢
答案 0 :(得分:1)
我在library中写过类似的问题。解决方案是从Adapter
解耦视图创建和视图绑定,并将它放在每个视图/元素/ RecyclerView项目的单个类中。
所以我实现了一个Generic adapter,它接受任何实现interface
的类(我称之为IItem)。此接口定义了为View
创建RecyclerView
所需的方法,用于定义类型和处理每个类型。基本上以下是最重要的:
int getType();
int getLayoutRes();
View generateView(Context ctx);
View generateView(Context ctx, ViewGroup parent);
VH getViewHolder(ViewGroup parent);
void bindView(VH holder);
适配器可以执行项目的任何实现,并可视化它们。关于item
的好处是您甚至可以通过RecyclerView
方法使用generateView
这些项目。
为了使其更灵活,更易于实施,我添加了AbstractItem
您可以在此处查看整个实施:https://github.com/mikepenz/FastAdapter
除item
概念外,它还提供了RecyclerView
项目中最常需要的许多功能。大多数事情都非常通用,以尽可能提高灵活性。
实现应该让您大致了解如何实现您的需求(或者您可以使用库)。
你会需要:
- “项目”的界面
- 能够处理这些“项目”的适配器
- “项目” - 实施,提供RecyclerView
Adapter